アプリを起動して終了するまで待機する

プログラム上から起動したプログラムが終了してから次の処理を初めたい場合のテクニックです。

サンプル(32bit)

'==================================================================================================
'  概要   : プログラムの実行
'               プログラムが終了するまで待機します。
'
'  引数   : strCommandLine : 実行するコマンドライン
'                intWindowStyle : 実行時のウィンドウの形式(Shell 関数と同じ値)
'
'  戻値   : なし
'==================================================================================================
Public Sub RunProcess(strCommandLine As String, intWindowStyle As Integer)
    
    Dim IDProcess As Long
    Dim hProcess As Long
    Dim ExitCode As Long
    Dim ret As Long
    Dim intSaveMousePointer As Integer
    
    intSaveMousePointer = Screen.MousePointer
    Screen.MousePointer = vbHourglass
    
    'プログラムの実行
    IDProcess = Shell(strCommandLine, intWindowStyle)
    
    Screen.MousePointer = intSaveMousePointer
    
    '終了するまで待つ
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 1, IDProcess)
    Do
        ret = GetExitCodeProcess(hProcess, ExitCode)
        DoEvents
    Loop While (ExitCode = STILL_ACTIVE)
    
    ret = CloseHandle(hProcess)
    
End Sub

サンプル解説

以下の手順で行っています。

  1. 通常通りShell関数でアプリを実行。
  2. Shell関数が返したプロセスIDを利用してOpenProcess関数でプロセスオブジェクトのハンドルを取得。
  3. GetExitCodeProcess関数で終了ステータスを取得。
  4. 終了ステータスがSTILL_ACTIVE(実行中)の場合は再度ループ。
  5. 終了したらCloseHandle関数でプロセスオブジェクトのハンドルを解放。

このルーチンは途中で、DoEventsを実行しているので呼び出し側アプリもユーザの操作に応答することができます。(フォームの再描画も行われます)
しかし、その場合、ボタンのClickイベントなどで同じプロシージャが二重実行されたり、フォームが閉じられたりと、予想できない状況に陥る場合があるので考慮したプログラミングが必要になります。


[ Window Close ]