作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
VB 6:如何执行 .bat 文件,但要等到其运行完成后再继续?
最佳答案
您将需要使用 Win32 API 调用 ShellExecuteEx和从SHELLEXECUTEINFO 结构中的ShellExecuteEx 返回的进程句柄上的WaitForSingleObject。这是我从项目中提取的旧代码。它 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
关于vb6 - VB 6 : How can I execute a . bat 文件但要等到其运行完成后再继续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/292098/
我是一名优秀的程序员,十分优秀!