VB 6:如何执行.bat文件,但要等到它完成运行才能继续运行?
您需要对SHELLEXECUTEINFO结构中ShellExecuteEx返回的进程句柄使用对ShellExecuteEx和WaitForSingleObject的Win32 API调用.这是我从项目中撤出的旧代码.它100%工作,但我可能没有包含所有依赖项.您应该能够根据您的要求进行编辑:
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 ' Optional fields' lpIDList As Long lpClass As String hkeyClass As Long dwHotKey As Long hIcon As Long hProcess As Long End Type Public Declare Function ShellExecuteEx Lib "shell32.dll" (lpExecInfo As SHELLEXECUTEINFO) As Long Public Declare Function apiShellExecute Lib "shell32.dll" _ Alias "ShellExecuteA" _ (ByVal hwnd As Long, _ ByVal lpOperation As String, _ ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) _ As Long Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Public Const SEE_MASK_NOCLOSEPROCESS As Long = &H40 Public Const SEE_MASK_FLAG_DDEWAIT As Long = &H100 '***App Window Constants***' Public Const WIN_NORMAL = 1 'Open Normal' Public Const WIN_MAX = 2 'Open Maximized' Public Const WIN_MIN = 3 'Open Minimized' '***Error Codes***' Private Const ERROR_SUCCESS = 32& Private Const ERROR_NO_ASSOC = 31& Private Const ERROR_OUT_OF_MEM = 0& Private Const ERROR_FILE_NOT_FOUND = 2& Private Const ERROR_PATH_NOT_FOUND = 3& Private Const ERROR_BAD_FORMAT = 11& ' Returns 'True' if file was opened ...' Public Function fHandleFile(ByVal stFile As String, _ ByVal lShowHow As Long, _ ByRef stRet As String, _ Optional ByVal bWaitForClose As Boolean = False) As Boolean On Error GoTo err_Handler Dim lRet As Long Dim ret As Long Dim lngProcessHandle As Long Dim varTaskID As Variant Dim shInfo As SHELLEXECUTEINFO Dim retval As Long 'First try ShellExecute' With shInfo .cbSize = LenB(shInfo) .lpFile = stFile .nShow = lShowHow If bWaitForClose Then .fMask = SEE_MASK_FLAG_DDEWAIT + SEE_MASK_NOCLOSEPROCESS End If .lpVerb = "open" End With Call ShellExecuteEx(shInfo) lRet = shInfo.hInstApp If lRet > ERROR_SUCCESS And bWaitForClose = True Then lngProcessHandle = shInfo.hProcess Do retval = WaitForSingleObject(lngProcessHandle, 0) DoEvents Loop Until retval <> 258 ret = CloseHandle(lngProcessHandle) End If fHandleFile = (lRet > 0) exit_handler: Exit Function err_Handler: RaiseError Err.Number, Err.Source, Err.Description End Function
这是一些执行此操作的简单代码.请注意,它会抽取消息(带有DoEvents),因此您的应用程序在等待时不会被冻结.
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Const SYNCHRONIZE = &H100000 Private Const WAIT_TIMEOUT As Long = &H102& Private Sub RunCommandLine(sCmdLine As String) Dim nProcessID As Long Dim hProcess As Long Dim nResult As Long nProcessID = Shell(sCmdLine, vbNormalNoFocus) If nProcessID <> 0 Then hProcess = OpenProcess(SYNCHRONIZE, 0, nProcessID) If hProcess <> 0 Then Do DoEvents nResult = WaitForSingleObject(hProcess, 50) Loop Until nResult <> WAIT_TIMEOUT Or m_bStop CloseHandle hProcess End If End If End Sub