(2008/01/21 追記) このページの情報は下記のページの注とあわせて利用してください。 このサンプルはHSP3からコンソール・アプリケーションを起動し、そのアプリが出力したデータを直接変数で受け取るスクリプトです。スクリプトに添付されている"cb.exe"の仕様はこちらです。 >> スクリプトを見る >> ダウンロード (実行に必要なファイルはすべてアーカイブに含まれています。)
あるアプリケーションが自分で実行したコンソール・アプリの出力を直接変数で受け取りたい場合、名無しパイプという仕組みが利用できます。 その手順はまずCreatePipe APIで名無しパイプを作成します。名無しパイプはプロセス間で一方向にのみデータを受け渡すのに使えるバッファです。この時、引数に指定するSECURITY_ATTRIBUTES構造体の第3メンバに1を指定し、作成したパイプのハンドルが子プロセス(今回の場合、スクリプトから実行するコンソール・アプリ)にも使えるようする必要があります。APIが成功するとバッファの読み書きに必要な2つのハンドルが得られます。サンプルでは、2つのハンドルのうち書き込み側ハンドルをコンソール・アプリに渡し、読み出し側ハンドルはコンソール・アプリの出力データを受け取るためにスクリプト内で使用します。
標準出入力をリダイレクトさせてコンソール・アプリを起動するにはCreateProcess(A) APIを使用します。 第1パラメータあるいは第2パラメータには起動する実行ファイルのフルパスまたはファイル名を指定します。基本的にはどちらか一方に指定して、もう一方はNULL(0)でいいのですが、2つのパラメータには細かい違いがあります。 第1パラメータにはコマンドライン引数やオプションの文字列を含めることはできず、実行ファイルのフルパスまたはファイル名をダブルクオテーションでくくってはいけません。またファイル名のみを指定した場合カレントディレクトリにある実行ファイルしか起動できません。 第2パラメータにはコマンドライン引数やオプションの文字列を含めることができ、実行ファイルパス(ファイル名)や引数に1バイトスペースが含まれている場合、ダブルクオテーションでくくる必要があります。実行ファイル名のみを指定した場合、システムディレクトリや環境変数PATHに記述されているディレクトリにあるものも起動できます。 さらにコンソール・アプリに渡すハンドルを有効にするために、第5パラメータに1を指定する必要があります。第9パラメータには種々の起動オプションを設定するためのSTARTUPINFO構造体を指定します。第10パラメータには起動したアプリのプロセスハンドルなどを受け取るためのPROCESS_INFOMATION構造体を指定します。 パイプの書き込み側ハンドルをアプリに渡すには、STARTUPINFO構造体の「標準出力ハンドル」メンバ(17番目のメンバ(バイト数では61バイト目))にセットし、ハンドルを有効にするために「構造体設定フラグ」メンバ(12番目のメンバ)にSTARTF_USESTDHANDLES(0x00000100)をセットすればOKです。また、STARTUPINFO構造体の「構造体設定フラグ」メンバにSTARTF_USESHOWWINDOW(0x00000001)を加え、「ウィンドウ初期表示状態」メンバ(13番目)に適切な値(表示しない場合は0)をセットすることで、起動時のウィンドウ状態を設定することができます。
コンソール・アプリが正常に起動したら、不要なハンドルをクローズした後、パイプからアプリの出力を取得します。データを読み取るにはデータの末尾をチェックしながら、ReadFile APIを繰り返し呼び出します。出力の取得が終わったら、パイプの読み取り側ハンドルをクローズすれば目的の処理は終了です。
今回のサンプルのような処理を行うときの注意点は、作成したパイプのハンドル、およびコンソール・アプリの起動時に得られるPROCESS_INFOMATION構造体に含まれるプロセスハンドルとメインスレッドハンドルを必ずクローズすること、必要なくなった時点ですぐにクローズすることです。 |