这里演示了一个执行Notepad,Notepad完成关闭后继续执行你的程序。
Private Const SYNCHRONIZE = &H100000
Private Const INFINITE = -1&
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As LongDim pId As Long, pHnd As LongPrivate Sub Command1_Click()
 pId = Shell("Notepad", vbNormalFocus)
 pHnd = OpenProcess(SYNCHRONIZE, 0, pId)
 Call WaitForSingleObject(pHnd, INFINITE)
 Call TerminateProcess(pHnd, 0)
 Call CloseHandle(pHnd)
 MsgBox "执行完成"
End Sub

解决方案 »

  1.   

    Option Explicit
    public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, 
    ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, 
    lpExitCode As Long) As Long
    public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Longpublic Const PROCESS_QUERY_INFORMATION = &H400
    public Const STATUS_PENDING = &H103&
    Public Function RunShell(cmdline As String) As Boolean
    Dim hProcess As Long
    Dim ProcessId As Long
    Dim exitCode As Long
    ProcessId = Shell(cmdline, 1)
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId)
    Do
    Call GetExitCodeProcess(hProcess, exitCode)
    DoEvents
    Loop While exitCode = STATUS_PENDING
    Call CloseHandle(hProcess)
    RunShell = True
    End Function  '在需要的地方调用RunShell过程,如:res=RunShell("c:\windows\notepad.exe")
    '返回值为真则程序结束