EmEditor FAN ! / EmEditorのマクロから様々なCOMコンポーネントを利用する
2008/08/30
COMはマイクロソフトの提唱するプログラムの部品の規格のようなものです。OLEオートメーション(自動化?MS-Office関連?)やActiveX(IE関連?)と呼ばれることがありますがほぼ同じものを差しているようです。
様々な名前がついていて胡散臭いですが、実際にスクリプトから利用する際の手順はシンプルです。
EmEditorのマクロではDocumentやEditorやSelectionやWindowといったエディタ自身のオブジェクトと同様に、様々な外部のCOMコンポーネントを利用することができます。
自分のPC上でどのようなCOMコンポーネントが利用できるかを知る方法についてはRubyist MagazineのCuzicさんの記事が大変参考になります。
スクリプティングのために用意されているコンポーネントということでWindowsに関する基本的な処理をほぼ網羅しています。特にインストールしなくても利用できると思います。
EmEditorマクロを
始めたらまずはWindows Script 5.6 ドキュメントをダウンロードしましょう。オンラインでも参照できます。
| ProgID | クラス名 | 説明 |
|---|---|---|
| Scripting.Dictionary | Dictionary | Perlのハッシュに相当するような連想配列を提供します。 |
| Scripting.FileSystemObject | FileSystemObject | ファイル処理をまとめたオブジェクトです、ファイルのコピーやテキストファイルの行単位の読み書きなども出来ます。 |
| WScript.Shell | WshShell | Windowsのシェルを操作して、レジストリの読み書き、外部プロセスの呼び出し、環境変数の読みとり、ポップアップメッセージの表示、ショートカットの作成などが出来ます。 |
| WScript.Network | WshNetwork | Windowsネットワーク上のドメイン、コンピュータ、ユーザ名を取り出したり、共有フォルダの操作などが出来ます。 |
Windowsに付属するブラウザInternet Explorerを利用して、クリップボード文字列の取得、ファイル選択ダイアログの表示、フォルダ選択ダイアログの表示を行います。関数の部分はそのまま再利用できます。
| ProgID | 説明 |
|---|---|
| Internet.Application | COM化されたIE |
| Shell.Application | IE統合されたエクスプローラです。 |
| Microsoft.XMLDOM | XMLパーサー |
| Microsoft.XMLHttpRequest | HTTPプロトコルによりインターネットから情報を得ることができます |
//クリップボード文字列の取得 (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);
Microsoft Officeに含まれるOutlook、無料で配布されるOutlook Expressは、ProgID、"Outlook.Application"を中心としたオブジェクトモデル体系を持ちます。これを利用したEmEditorの編集中のウィンドウからOutlookのメールを作るマクロが江村さんから公開されています。
ADOはWindowsのデータベースライブラリです。以下の様に、重要な機能を持ち、マクロで行えることの幅を広げます。
CDOはWindowsの電子メールなどのメッセージング アプリケーションやコラボレーションのためのライブラリです。
.NET FrameworkもCOM同様Microsoftオブジェクト指向設計によるライブラリ/フレームワークなのですが、より構造が洗練されてモダンな設計になっています。COMとの互換性は基本的にはないのですが、一部のクラスは利用可能であるようです。
Appleが提供する音楽鑑賞ソフト、iTunesはインストールするだけでCOMとしてAPI(ProgID:iTunes.Application)が活用できます。APIの内容は英語になりますが、Appleのサイトからダウンロードできます。このAPIを活かした拙作のiTunesマクロも公開しています。
Internet Explorerと同じブラウザエンジンを使って実装されたタブブラウザSleipnirは「スクリプトによるクライアントの操作を許可する」を有効にすることで、COMとしてのAPI(ProgID:Sleipnir.API)が有効になります。Internet Explorerと同様にブラウザ内部のDOMへのアクセスが可能です。
EBシリーズの作者でもある hishida さんによって公開されている。Microsoft Word などの各種オフィスアプリケーションが扱うファイルフォーマットをテキストに変換するソフト、xdoc2txt は、"XDOC2TXT.xdoc2txtCtrl.1"をProgIDとしたActiveXのAPIを持ちます。ちなみに現在、以下のソフト、フォーマットに対応しているようです。
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を適当なフォルダに保存し
regsvr32 "DLLのパス"
としてください。削除したい場合は
regsvr32 /u "DLLのパス"
とし、登録を解除したのち、DLLを削除してください。COMコンポーネントを提供するファイルの拡張子には.dll以外に.ocxや.wscといった拡張子も考えられます。
EmEditor FAN ! / EmEditorのマクロから様々なCOMコンポーネントを利用する
おすすめのマクロ(Windows Scripting Host)の参考書籍です。