Programming」さんのWindowsアプリからWScript.exeのWScriptオブジェクトを利用するをとりあえず試してみた。頭の中にあったのが「WScriptオブジェクトをHTAに渡せば、HTAからグローバルメンバにアクセスできるぜ。へへへ」てなことだったのだが、なんかイマイチうまくいかなかった。thisはfalseになるので無理だったのだが、それがわかるまで結構ハマった。IEを経由させるのはWScriptではなくthisにするようにしてみた。他にも型のチェックとかで元のコードを単純に移行しても動かなかったのと、もらったWScriptからWshShellを作成してPopup叩いてもイマイチ面白くないので、HTAからWScript.EchoとWScript.StdIn.ReadLineを試してみるようにした。作ってみたコードまずjs側。名前を「wsh.js」とする。);そんでこっちがHTA側。名前はなんでもいいけど「test.hta」とかにしておく。wsh.jsからプロパティがセットされるとundefinedではなくなる。ws.readln("なんか入力すれ。);</script></html>IEに設定するプロパティ名が「WScript」になっているが、wsh.jsでセットしているオブジェクトはWScriptではなく、グローバルコードでの「this」になるので注意。test.htaとwsh.jsを同じところに配置してtest.htaを起動すると、コンソール(cscript.exe)が起動して、1秒間隔で10回時間を表示するコンソールで入力を求められるHTA側でコンソールで入力された文字をalertして終了コンソール側もメッセージを表示して終了となる。簡単なライブラリ化をしてjsからHTAをダイアログのように使うのも試してみたので次のエントリで。20時40分45秒ってほど大層なもんじゃないけど、まあこれも一種のIPCになるかなぁ、と思ったり。scripthost.jsのソースまずはライブラリコードから。これはwsh・htaの両方から共通で使用する。);}}使い方コンストラクタは役割によって使い分ける。先に起動しているほうは引数なしで実行、後で呼び出された側では、コマンドライン引数かなにかでIEのhWndを受け取って、それを引数として実行する。次にホストオブジェクトを設定するほう(=wsh側だな)がsetHostメソッドを実行する。引数はHTA側に渡したいオブジェクトならなんでもよいが、「HTAからWScriptのグローバルコードへアクセスする」のであればグローバルな「this」を渡す。受け取り側(HTA側)ではgetHostメソッドでホストオブジェクトを受け取る。後は工夫次第でお互いに通信が可能になる。サンプルコード(HTA)WSHからダイアログ扱いされるHTAのサンプルを以下に示す。ファイル名は「test.hta」とする。);</script></html>コマンドライン引数の解析のコードがちょっとうざいが我慢して欲しい。type=fileでファイルを選択して「確定」をクリックすると、呼び出し元のWSHにファイルパスと終了を通知して終了する。サンプルコード(JS)ちょっと長いので、ライブラリロードだの、echoだのreadlnだのの定義は省略し、肝心の部分のみ記載する。ロードするライブラリは「dummy.js」、「prototype.js」および今回の「scripthost.js」の3つ。dummy.jsはここらあたりのものを拾って使って欲しい。ファイル名はこちらも単純に「test.js」としておこう。"ファイルを選択してください。);で、実行するとtest.jsを起動すると自動的にtest.htaが呼び出されるtest.htaでファイルを選択し、「確定」をクリックするとtest.htaは終了test.jsのコンソールにはhtaで選択したファイルのパスが表示されると、たったこれだけ。この方法ならcscriptから呼び出し可能なカスタムダイアログが作れると思う。IEにHTAのwindowをセットするとかできそうだし。今回のサンプルコード一式を以下のリンクからダウンロードできるようにした。wsh_20070605.zipprototype.jsも1.5.1を同梱している。prototype.js以外のjs、htaはnyslとする。吊ブックマークレットtumblrのキーボードショートカットが便利になっとる。Chrome編dataスキームの画像をブロックしてみるローカルストレージを確認したり消したりするブックマークレットそうそう、いまさらTwitter始めました。(9)このブログについてJavaScriptとかC#とかPHPとか。