WScript - HTA 相互通信ライブラリ
2007-06-05


ってほど大層なもんじゃないけど、まあこれも一種のIPCになるかなぁ、と思ったり。

scripthost.jsのソース

まずはライブラリコードから。これは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メソッドでホストオブジェクトを受け取る。

後は工夫次第でお互いに通信が可能になる。

サンプルコード(HTA)

WSHからダイアログ扱いされるHTAのサンプルを以下に示す。ファイル名は「test.hta」とする。



続きを読む

[JavaScript]
[WSH]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット