ってほど大層なもんじゃないけど、まあこれも一種のIPCになるかなぁ、と思ったり。
まずはライブラリコードから。これはwsh・htaの両方から共通で使用する。要:prototype.js
Object.extend( Enumerator.prototype, {
_each : function(iterator) {
this.moveFirst();
var i = 0;
try {
for(; ! this.atEnd(); this.moveNext()) {
try {
iterator( this.item(), i++ );
} catch(e) {
if( e != $continue ) throw e;
}
}
} catch(e) {
if( e != $break ) throw e;
}
}
} );
Object.extend( Enumerator.prototype, Enumerable );
var WshHost = Class.create();
WshHost.prototype = {
initialize : function(hWnd) {
if( isNaN( hWnd ) ) {
this._ie = new ActiveXObject("InternetExplorer.Application");
} else {
this._ie = new Enumerator( new ActiveXObject("Shell.Application").Windows() ).find( function(ie) {
return ie.hWnd == hWnd;
} );
if( ! this._ie ) throw new Error( "ie not found" );
}
this.id = this._ie.hWnd;
},
setHost : function(host) {
this._ie.PutProperty( "Host", host );
},
getHost : function() {
return this._ie.GetProperty( "Host" );
}
}
コンストラクタは役割によって使い分ける。先に起動しているほうは引数なしで実行、後で呼び出された側では、コマンドライン引数かなにかでIEのhWndを受け取って、それを引数として実行する。
次にホストオブジェクトを設定するほう(=wsh側だな)がsetHostメソッドを実行する。引数はHTA側に渡したいオブジェクトならなんでもよいが、「HTAからWScriptのグローバルコードへアクセスする」のであればグローバルな「this」を渡す。
受け取り側(HTA側)ではgetHostメソッドでホストオブジェクトを受け取る。
後は工夫次第でお互いに通信が可能になる。
WSHからダイアログ扱いされるHTAのサンプルを以下に示す。ファイル名は「test.hta」とする。
セコメントをする