Visual Basic Tips


VBから起動したプログラムが終了するまで待機(Wait)する(API)


いろいろやり方があると思いますが、とりあえず2パターン載せておきます。どちらも対象となるプログラムを起動して、WaitForSingleObjectで待機しています。違うのはプロセスハンドルの取得の部分だけです。

'ShellExecuteEX使用
  Dim sdtSEXI As SHELLEXECUTEINFO
  
Dim lret As Long

  
With sdtSEXI
    .cbSize = Len(sdtSEXI)
    .fMask = SEE_MASK_NOCLOSEPROCESS
    .hwnd = Me.hwnd
    .lpVerb = "open"
    .lpFile = "c:\windows\calc.exe"
    .lpParameters = vbNullChar
    .lpDirectory = vbNullChar
    .nShow = SW_SHOWNORMAL
    .hInstApp = 0
    .lpIDList = 0
  
End With

  lret = ShellExecuteEX(sdtSEXI)
  lret = WaitForSingleObject(sdtSEXI.hProcess, INFINITE)
  MsgBox "終了しました。"

'Shell使用
  Dim hProcess As Long

  lret = Shell("c:\windows\calc.exe", vbNormalFocus)
  hProcess = OpenProcess(SYNCHRONIZE, 0, lret)
  lret = WaitForSingleObject(hProcess, INFINITE)
  lret = CloseHandle(hProcess)
  MsgBox "終了しました。"

'---------------------------------------------------------------
'
'---------------------------------------------------------------
'WaitForSingleObject
Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

'CloseHandle
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
'OpenProcess
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

'OpenProcessで使用する定数
Public Const SYNCHRONIZE = &H100000
'WaitForSingleObjectで使用する定数
Public Const INFINITE = &HFFFF ' Infinite timeout

'ShellExecuteEX
Public Declare Function ShellExecuteEX Lib "shell32.dll" Alias "ShellExecuteEx" (SEI As SHELLEXECUTEINFO) As Long

'ShellExecuteEXで使用する構造体
Public Type SHELLEXECUTEINFO
  cbSize
As Long
  fMask
As Long
  hwnd
As Long
  lpVerb
As String
  lpFile
As String
  lpParameters
As String
  lpDirectory
As String
  nShow
As Long
  hInstApp
As Long
  lpIDList
As Long
  lpClass
As String
  hkeyClass
As Long
  dwHotKey
As Long
  hIcon
As Long
  hProcess
As Long
End Type
'ShellExecuteEXで使用する定数
Public Const SEE_MASK_NOCLOSEPROCESS = &H40
Public Const SW_SHOWNORMAL = 1


DownLoad vbtips053.lzh 2KB (VB6.0)