EmEditorのマクロから様々なCOMコンポーネントを利用する

EmEditor FAN ! / EmEditorのマクロから様々なCOMコンポーネントを利用する

2008/08/30

COMコンポーネントとは?

COMはマイクロソフトの提唱するプログラムの部品の規格のようなものです。OLEオートメーション(自動化?MS-Office関連?)やActiveX(IE関連?)と呼ばれることがありますがほぼ同じものを差しているようです。
様々な名前がついていて胡散臭いですが、実際にスクリプトから利用する際の手順はシンプルです。

EmEditorのマクロではDocumentEditorSelectionWindowといったエディタ自身のオブジェクトと同様に、様々な外部のCOMコンポーネントを利用することができます。

インストールされているCOMコンポーネントについての情報を得る

自分のPC上でどのようなCOMコンポーネントが利用できるかを知る方法についてはRubyist MagazineのCuzicさんの記事が大変参考になります。

Windows Scriptが提供するCOMコンポーネント

スクリプティングのために用意されているコンポーネントということでWindowsに関する基本的な処理をほぼ網羅しています。特にインストールしなくても利用できると思います。
EmEditorマクロを 始めたらまずはWindows Script 5.6 ドキュメントをダウンロードしましょう。オンラインでも参照できます。

ProgIDクラス名説明
Scripting.DictionaryDictionaryPerlのハッシュに相当するような連想配列を提供します。
Scripting.FileSystemObjectFileSystemObjectファイル処理をまとめたオブジェクトです、ファイルのコピーやテキストファイルの行単位の読み書きなども出来ます。
WScript.ShellWshShellWindowsのシェルを操作して、レジストリの読み書き外部プロセスの呼び出し、環境変数の読みとり、ポップアップメッセージの表示ショートカットの作成などが出来ます。
WScript.NetworkWshNetworkWindowsネットワーク上のドメイン、コンピュータ、ユーザ名を取り出したり、共有フォルダの操作などが出来ます。

Internet Explorer が提供するCOMコンポーネント

Windowsに付属するブラウザInternet Explorerを利用して、クリップボード文字列の取得、ファイル選択ダイアログの表示、フォルダ選択ダイアログの表示を行います。関数の部分はそのまま再利用できます。

ProgID説明
Internet.ApplicationCOM化されたIE
Shell.ApplicationIE統合されたエクスプローラです。
Microsoft.XMLDOMXMLパーサー
Microsoft.XMLHttpRequestHTTPプロトコルによりインターネットから情報を得ることができます
//クリップボード文字列の取得 (V5.0より同等の機能がEmEditor本体に内蔵)
//なぜか別のウィンドウがアクティブになってしまいます。(それ以外は正常に動作します)
//また、インターネット オプションのセキュリティ設定のレベルのカスタマイズから、
//「スクリプトによる貼り付け処理の許可」を「有効にする」にしないとうまく動かないようです。
function Clipboard()
{
	var ie = new ActiveXObject( "InternetExplorer.Application" );
	ie.Navigate("about:blank");
	var cbtext = ie.document.parentWindow.clipboardData.getData("text");
	ie.Quit();
	return cbtext;
}
alert(Clipboard());
//ファイルを開くダイアログ
//なぜか別のウィンドウがアクティブになってしまいます。(それ以外は正常に動作します)
function FileOpenDialog()
{
	var ie = new ActiveXObject("InternetExplorer.Application");
	ie.Navigate2("about:<html><body><input type='file' id='fileDialog'></body></html>");
	while (ie.Busy || (ie.ReadyState != 4)) Sleep(10);
	ie.Document.all.fileDialog.click();
	var file = ie.Document.all.fileDialog.value;
	ie.Quit();
	return file;
}
var file = FileOpenDialog();
alert(file);
//フォルダ選択ダイアログ
function FolderSelectDilaog()
{
	var title = "フォルダを選択してください";
	var option = 0x0050;
	var root = "";
	var shell = new ActiveXObject("Shell.Application");
	var folder = shell.BrowseForFolder(0, title, option, root);
	return folder ? folder.Self.Path : ""; // WinXP
//	return folder ? folder.Items.Item(0).Path : ""; // WinXP以前
}
var folder = FolderSelectDilaog();
alert(folder);

Outlook が提供するCOMコンポーネント

Microsoft Officeに含まれるOutlook、無料で配布されるOutlook Expressは、ProgID、"Outlook.Application"を中心としたオブジェクトモデル体系を持ちます。これを利用したEmEditorの編集中のウィンドウからOutlookのメールを作るマクロが江村さんから公開されています。

ADO(ActiveX Data Object) が提供するCOMコンポーネント

ADOはWindowsのデータベースライブラリです。以下の様に、重要な機能を持ち、マクロで行えることの幅を広げます。

CDO(Collaboration Data Objects) が提供するCOMコンポーネント

CDOはWindowsの電子メールなどのメッセージング アプリケーションやコラボレーションのためのライブラリです。

.NET Framework が提供するCOMコンポーネント

.NET FrameworkもCOM同様Microsoftオブジェクト指向設計によるライブラリ/フレームワークなのですが、より構造が洗練されてモダンな設計になっています。COMとの互換性は基本的にはないのですが、一部のクラスは利用可能であるようです。

iTunes が提供するCOMコンポーネント

Appleが提供する音楽鑑賞ソフト、iTunesはインストールするだけでCOMとしてAPI(ProgID:iTunes.Application)が活用できます。APIの内容は英語になりますが、Appleのサイトからダウンロードできます。このAPIを活かした拙作のiTunesマクロも公開しています。

Sleipnir が提供するCOMコンポーネント

Internet Explorerと同じブラウザエンジンを使って実装されたタブブラウザSleipnir「スクリプトによるクライアントの操作を許可する」を有効にすることで、COMとしてのAPI(ProgID:Sleipnir.API)が有効になります。Internet Explorerと同様にブラウザ内部のDOMへのアクセスが可能です。

xdoc2txt が提供するCOMコンポーネント

EBシリーズの作者でもある hishida さんによって公開されている。Microsoft Word などの各種オフィスアプリケーションが扱うファイルフォーマットをテキストに変換するソフト、xdoc2txt は、"XDOC2TXT.xdoc2txtCtrl.1"をProgIDとしたActiveXのAPIを持ちます。ちなみに現在、以下のソフト、フォーマットに対応しているようです。

SeraphyScriptDialogでGUIを組み立てる

EmEditorのマクロやWindows Scriptにはいくつかダイアログが用意されているのですが、ボタンが2つ3つしか使えないので、単純な入力しか得ることができません。リストボックスなども使いたくなるときもあると思います。
SeraphyさんがWSHのためにダイアログGUIを組み立てるCOMコンポーネントを開発、配布されていますので、これが利用できると思います。ダウンロードしたファイルをインストールする方法についてはこちらも参考にしてください。

var seraphy = new ActiveXObject("SeraphyScriptDialog");
var form = seraphy.CreateForm();
form.FormTitle = "マクロからダイアログ";
form.DefineLabel("HTMLタグつきテキストの自動入力");
form.DefineEdit("テキスト", "ここに入力");
form.DefineLabel("リストボックス");
form.DefineListBox("h1;h2;h3;h4;h5;h6;p",0,3);
form.DefineButton("OK;CANCEL");
var result = form.ExecuteForm();

if ((result == 4) && (form.Value(4) == 0))
{
	var tags = new Array("h1","h2","h3","h4","h5","h6","p");
	var tag = tags[form.Value(3)];
	var text =form.Value(1);
	var html = "<" + tag + ">" + text + "</" + tag + ">";
	document.selection.Text = html;
}

上のスクリプトを拡張子jseeで保存し、EmEditorマクロとして実行すると、次のような画面がでると思います。SeraphyScriptDialogについてくるヘルプ、サンプルを参考にいろいろ試してください。

インストーラがなくDLLだけが提供されている場合のCOMコンポーネントの登録方法

インストーラがなくDLLだけが提供されているようなCOMコンポーネントがあります、これを利用するにはDLLを適当なフォルダに保存し

regsvr32 "DLLのパス"

としてください。削除したい場合は

regsvr32 /u "DLLのパス"

とし、登録を解除したのち、DLLを削除してください。COMコンポーネントを提供するファイルの拡張子には.dll以外に.ocxや.wscといった拡張子も考えられます。

Windows Script
Microsoft公式のWSHサイト、まずはここでドキュメントをダウンロードしてインストールすることをお勧めします。
Windows Scripting Host Laboratory
COMコンポーネントをつかったWSHのサンプルがいくつか紹介されています。
趣味のJavaScriptなページ by AYA:Windows Scripting Host
実用的なWSHのサンプルやレファレンスなど。
@IT Windows管理者のためのWindows Script Host入門
管理者の視点でWSHの使い方を紹介しています。
逆境スクリプト Obscurity Of Windows Scripting Host
WSHに関するリンク集が秀逸です。
WMI Fun !!
WMI(Windows Management Instrumentation)の豊富なサンプルがあります。

EmEditor FAN ! / EmEditorのマクロから様々なCOMコンポーネントを利用する


おすすめのマクロ(Windows Scripting Host)の参考書籍です。

inserted by FC2 system