次へサブプログラムの終了を待つ(2)サンプルスクリプトさて、実際のスクリプト書いて見ましょう。今回はメインプログラムからメモ帳を実行し、メモ帳が閉じられたらメインプログラムが実行を再開するようにしてみましょう。"サブプロセスが終了しました。"end前回も述べましたが、普通に起動させるのであれば、STARTUPINFO構造体には特に何も指定する必要はありません。cbメンバに構造体サイズ68を格納し、それ以外のメンバはすべて0になるように指定します。今回はCreateProcess関数の第2引数に実行ファイル名「notepad.exe」を指定しています。第1引数に指定しないのかというと、第1引数に実行ファイル名を指定する場合は、フルパス指定か、さもなくばカレントディレクトリの実行ファイルを指定することしかできないためです。第2引数に(必要ならコマンドラインパラメータも添えて)指定すると、実行ファイルをカレントディレクトリのほかにWindowsディレクトリやシステムディレクトリからも検索してくれます。拡張子「.exe」を省略することもできます。メモ帳はWindowsディレクトリ内にあるので、こうしなければならないのです。CreateProcess関数を呼び出したら、必要のないプライマリスレッドのハンドルはすぐにCloseHandle関数を使ってクローズしておきます。その後、プロセスのハンドルを引数としてWaitForSingleObject関数を呼び出します。メモ帳が終了するまではここで処理が中断されます。処理が再開されたら、プロセスのハンドルをクローズします。待機中にメインプロセスを動かすには上のサンプルを実行させてみると分かりますが、サブプロセスが終了しているのを待機している間は、メインプロセスのウィンドウはまったく反応しません。指定しているため、サブプロセスが終了するまで無限に待ち続けます。その間、ウィンドウの移動やサイズ変更、プロセスの終了もできないというのは、少々困ります。これらの問題を解決するには、WaitForSingleObject関数の待ち時間として、INFINITE以外の適切なタイムアウト値(あるいは0)を指定します。返すまで繰り返し呼び出します。この場合には、サブプロセスが終了したかどうかをループ中で監視をするのですが、ウィンドウの処理に対応するためにはこのループ中にwaitまたはawaitを実行する必要があります。この方法により、プロセス終了を監視しながら他の処理を平行して行うことも可能となります。main2.asここでは、上の2つの方法のうち、タイムアウト時間を指定する方法のみを紹介しておきましょう。サブプロセスはまだ終了していません。