これらの 2 つの Microsoft KB 記事を確認してください。
Visual Basic から Win32 アプリケーションを起動する方法
と
32 ビット アプリケーションを使用して、シェル化されたプロセスがいつ終了するかを判断する方法
どちらも、プロセスを起動し、その完了を確認するためのフレームワークをすばやく提供します。各 KB 記事には、関連する可能性のある追加のリファレンスがいくつかあります。
後者のナレッジベースの記事では、シェル プロセスが終了するまで無限に待機することを前提としています。
ret& = WaitForSingleObject(proc.hProcess, INFINITE) 関数呼び出しを変更して、ミリ秒単位の有限時間後に戻るようにできます。INFINITE をミリ秒を表す正の値に置き換え、全体を Do While ループにラップします。戻り値は、プロセスが完了したか、タイマーが切れたかを示します。プロセスが終了した場合、戻り値はゼロになります。
戻り値がゼロ以外の場合、プロセスは引き続き実行されますが、制御はアプリケーションに戻されます。この間、アプリケーションを積極的に制御している間に、何らかの UI ステータスを更新するかどうか、キャンセルの確認などを行うかどうかを決定できます。または、もう一度ループして、さらに待機することもできます。
シェルしているプログラムがあなたが書いたものである場合、追加のオプションさえあります。そのウィンドウの 1 つにフックして、プログラムにメッセージを投稿させ、添付してステータス フィードバックとして使用することができます。これは、検討する必要がある場合は、別の項目に残しておくのがおそらく最善です。
プロセス構造体を使用して、呼び出されたプロセスから戻り値を取得できます。これを有効にするには、プロセスが値を返す必要があります。
この種のニーズに対する私の一般的なアプローチは、次のとおりです。
- プロセスの開始時に、ユーザーにキャンセル ボタン付きの非モーダル ステータス ダイアログを表示します。キャンセル ボタンをクリックすると、後でチェックするフラグが設定されます。ユーザーに何らかのステータスを提供することはほとんどの場合不可能であるため、経過時間またはアニメーション GIF のいずれかを提供すると、期待を管理するのに役立つ場合があります。
- プロセスを開始する
- プロセスが完了するのを待ち、500msごとにキャンセルチェックを許可します
- プロセスが完了したら、ダイアログを閉じて続行します。
- プロセスが完了していない場合は、ユーザーがキャンセルを押したかどうかを確認し、キャンセルした場合はプロセスのウィンドウに終了メッセージを送信します。これは機能しない可能性があり、プロセスの終了が必要になる場合があります。これを行う場合は注意してください。適切に閉じられない場合は、プロセスを放棄することをお勧めします。この時点でタイムアウトを確認し、ユーザーがキャンセルを押した場合と同じパスを試すこともできます。
これが役に立てば幸いです、ビル。