VB6他のプログラムを起動して終了するまで待つ

スポンサーリンク

VB6 では、Win32API の WaitForSingleObject 関数を使用します。標準モジュールなどで、以下の Win32API 関数と自作の WaitForExitProcess 関数を定義しておいてください。

サンプルコード

以下にサンプルコードを示します。

VB6.0 以前
Option Explicit

' OpenProcess 関数
Private Declare Function OpenProcess Lib "KERNEL32.DLL" ( _
    ByVal dwDesiredAccess As Long, _
    ByVal bInheritHandle  As Long, _
    ByVal dwProcessId     As Long  _
) As Long

' CloseHandle 関数
Private Declare Function CloseHandle Lib "KERNEL32.DLL" ( _
    ByVal hObject As Long _
) As Long

' WaitForSingleObject 関数
Private Declare Function WaitForSingleObject Lib "KERNEL32.DLL" ( _
    ByVal hHandle        As Long, _
    ByVal dwMilliseconds As Long  _
) As Long

' 定数の定義
Private Const SYNCHRONIZE As Long = &H100000
Private Const INFINITE    As Long = &HFFFF

' -------------------------------------------------------------------------------
'       プロセスが終了するまで指定したミリ秒数待機します。
'
' @Param    lProcessId      終了するまで待機するプロセスの ID。
' @Param    [lMilliseconds] 終了するまで待機する時間。(省略時は無限)
' -------------------------------------------------------------------------------
Public Sub WaitForExitProcess(ByVal lProcessId As Long, Optional ByVal lMilliseconds As Long = INFINITE)
    Dim hProcessHandle As Long

    ' Process を開いてハンドルを取得する
    hProcessHandle = OpenProcess(SYNCHRONIZE, 0&, lProcessId)

    If hProcessHandle <> 0 Then
        ' 終了するまで、指定したミリ秒数待機する
        Call WaitForSingleObject(hProcessHandle, lMilliseconds)

        ' Process のハンドルを閉じる
        Call CloseHandle(hProcessHandle)
    End If
End Sub

使用例は以下のようになります。

VB6.0 以前
    ' プロセス ID を格納するための変数を宣言する
    Dim lProcessId As Long

    ' メモ帳を起動してプロセス ID を取得する
    lProcessId = CLng(Shell("Notepad", vbNormalFocus))

    ' 終了するまで待機する
    Call WaitForExitProcess(lProcessId)

    ' 終了した旨を表示する
    Call MsgBox("メモ帳が終了しました")

関連するリファレンス

準備中です。

スポンサーリンク