谢谢,
我执行的这个BAT命令执行的时间较长, 约10分钟,一直都是等 BAT执行完再执行别的代码,结果是一执行BAT,主界面就像死机一样,现在 想让 BAT 能另开一个 线程或进程 ,我在主窗口判断 是否结束, 这样主窗口就不会像死机一样
Dim si As SHELLEXECUTEINFO
si.cbSize = Len(si)
si.lpVerb = "open"
si.lpFile = "temp.bat"
si.lpParameters = ""
si.lpDirectory = ""
si.nShow = 5 'SW_SHOW = 5
'SW_HIDE = 0
'SW_MINIMIZE = 6
'SW_RESTORE = 9
si.fMask = &H40 'SEE_MASK_NOCLOSEPROCESS ShellExecuteEx si
If si.hProcess <> 0 Then
WaitForSingleObject si.hProcess, &HFFFFFFFF ' 无限等待, 直到程式结束
CloseHandle si.hProcess
End If
我执行的这个BAT命令执行的时间较长, 约10分钟,一直都是等 BAT执行完再执行别的代码,结果是一执行BAT,主界面就像死机一样,现在 想让 BAT 能另开一个 线程或进程 ,我在主窗口判断 是否结束, 这样主窗口就不会像死机一样
Dim si As SHELLEXECUTEINFO
si.cbSize = Len(si)
si.lpVerb = "open"
si.lpFile = "temp.bat"
si.lpParameters = ""
si.lpDirectory = ""
si.nShow = 5 'SW_SHOW = 5
'SW_HIDE = 0
'SW_MINIMIZE = 6
'SW_RESTORE = 9
si.fMask = &H40 'SEE_MASK_NOCLOSEPROCESS ShellExecuteEx si
If si.hProcess <> 0 Then
WaitForSingleObject si.hProcess, &HFFFFFFFF ' 无限等待, 直到程式结束
CloseHandle si.hProcess
End If
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpExitCode As Long) As Long
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Private Const PROCESS_QUERY_INFORMATION As Long = (&H400)
Private Const STILL_ACTIVE As Long = &H103
Sub ShellWait(FileName As String)
Dim hShell As Long
Dim hProc As Long
Dim lExit As Long
hShell = Shell(FileName, 3)
hProc = OpenProcess(PROCESS_QUERY_INFORMATION, False, hShell)
Do
GetExitCodeProcess hProc, lExit
DoEvents
Loop While lExit = STILL_ACTIVE
End SubPrivate Sub Command1_Click()
ShellWait "f:\word.exe"
MsgBox "运行完毕!"
End Sub
原文地址:http://community.csdn.net/Expert/topic/3675/3675075.xml?temp=.3692896
我试试先