● Shell関数で起動したウインドウの終了を待つ ●

これも定番。DoEvents がちょっとした隠し味。嘘だと思うなら削除してみれば? でもこれって、ループしまくるんでCPUの使用率が100%になってしまう。なんとかならんものないかな。

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Const SYNCHRONIZE = &H100000
Private Const INFINITE = &HFFFF
Private Const PROCESS_QUERY_INFORMATION = &H400&
Private Const STILL_ACTIVE = &H103&

'-------------------------------------------------------------------
' 関数名 : WaitBatFileEnd
' 機  能 : Shell関数で起動をしたプログラムの同期処理を行う
' 引  数 : (in) ProcessID … プロセスID
' 返り値 : なし
'-------------------------------------------------------------------
Public Sub WaitBatFileEnd(ByVal ProcessID As Long)

    Dim ProcesshWnd As Long
    Dim ExitCode As Long

    'プロセスハンドルを得る
    ProcesshWnd = OpenProcess(PROCESS_QUERY_INFORMATION, 1, ProcessID)

    Do
        Call GetExitCodeProcess(ProcesshWnd, ExitCode)
        DoEvents
    Loop While (ExitCode = STILL_ACTIVE)

    'プロセスハンドルを解放する
    Call CloseHandle(ProcesshWnd)

End Sub

戻る