ってほど大層なもんじゃないけど、まあこれも一種の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」とする。
セコメントをする