以前の記事「【VB.NET】プログラムから別のアプリケーションを実行する 」の応用で、実行したアプリケーションが終了するまで処理を待機する方法について説明する。

プログラム中で別のアプリケーションを起動した場合、別プロセスで実行する。
プロセスが異なるため、起動した側のアプリケーションでは、起動された側のアプリケーションの挙動を感知することはしない。
(これは、マルチプロセスを実現するために必要なコンピュータの基本的な動作であり、正常な状態である)
そのため、起動した側のアプリケーションで起動された側のアプリケーションの終了を感知するには、待機を明示する必要がある。

アプリケーションが終了するまで待機するには、ProcessクラスのWaitForExit()メソッドを利用する。
以下、サンプル。
Public Class ProcessSample
 Public Shared Sub Main()
  Dim Sample As New ProcessSample
  Sample.ExecOtherApplication("Notepad.exe", "")
 End Sub

 Private Sub ExecOtherApplication( _
  ByVal AppName As String, ByVal Args As String)

  Dim oProc As New Process
  Dim oSInfo As New ProcessStartInfo

  With oSInfo
   .FileName = AppName
   '引数を設定する
   .Arguments = Args
  End With
  oProc.StartInfo = oSInfo
  oProc.Start()

  'アプリケーションの終了を待つ
  oProc.WaitForExit()
  Debug.WriteLine(AppName & "を終了しました")
 End Sub
End Class

上記サンプルの「oProc.WaitForExit()」の処理をコメント化して実行してみると、違いが分かる。
該当箇所をコメント化すると、起動したアプリケーションが終了していない状態でも、「〜を終了しました」と表示される。
該当箇所が有効であると、起動したアプリケーションが終了した後に「〜を終了しました」と表示される。

【補足事項】
・引数を指定する場合には、ProcessStartInfo.Argumentsプロパティを利用する。
 →引数は、文字列配列ではなく文字列として扱う。
・Process.StartInfoオブジェクトに実行するアプリケーションが登録されていない場合、WaitForExit()メソッドは利用できない。
 →実行時エラー(System.InvalidOperationException)が発生する。

 エラーが発生するプログラムのサンプル。
 上記サンプルのExecOtherApplication()メソッドを以下に置き換える。

 Private Sub ExecOtherApplication( _
  ByVal AppName As String, ByVal Args As String)

  Dim oProc As New Process
  Dim oSInfo As New ProcessStartInfo

  With oSInfo
   .FileName = AppName
   .Arguments = Args
  End With
  oProc.Start(oSInfo)

  'アプリケーションの終了を待つ
  oProc.WaitForExit()
  Debug.WriteLine(AppName & "を終了しました")
 End Sub