以前の記事「【VB.NET】プログラムから別のアプリケーションを実行する 」の応用で、実行したアプリケーションが終了するまで処理を待機する方法について説明する。
プログラム中で別のアプリケーションを起動した場合、別プロセスで実行する。
プロセスが異なるため、起動した側のアプリケーションでは、起動された側のアプリケーションの挙動を感知することはしない。
(これは、マルチプロセスを実現するために必要なコンピュータの基本的な動作であり、正常な状態である)
そのため、起動した側のアプリケーションで起動された側のアプリケーションの終了を感知するには、待機を明示する必要がある。
アプリケーションが終了するまで待機するには、ProcessクラスのWaitForExit()メソッドを利用する。
以下、サンプル。
プログラム中で別のアプリケーションを起動した場合、別プロセスで実行する。
プロセスが異なるため、起動した側のアプリケーションでは、起動された側のアプリケーションの挙動を感知することはしない。
(これは、マルチプロセスを実現するために必要なコンピュータの基本的な動作であり、正常な状態である)
そのため、起動した側のアプリケーションで起動された側のアプリケーションの終了を感知するには、待機を明示する必要がある。
アプリケーションが終了するまで待機するには、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
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
- カテゴリ:
- VB.NET