我在vb程序中调用shell函数,执行.bat批处理文件
现在知道利用API 可以判断一个进程是否结束,如下
Const SYNCHRONIZE = &H100000
Const INFINITE = &HFFFFFFFF
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 WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long但是调用了WaitForSingleObject后,vb中的其他程序都不能运行了,我可以同时判断进程是否结束,同时也能在vb中做其他操作呢?
我不知道这个是不是和多进程有关,请高手指点一下吧
现在知道利用API 可以判断一个进程是否结束,如下
Const SYNCHRONIZE = &H100000
Const INFINITE = &HFFFFFFFF
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 WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long但是调用了WaitForSingleObject后,vb中的其他程序都不能运行了,我可以同时判断进程是否结束,同时也能在vb中做其他操作呢?
我不知道这个是不是和多进程有关,请高手指点一下吧
只有当其返回时才会接着执行下面语句
用多线程可以解决DoEvent
我不懂线程,可不可以讲具体一点呢?
谢谢了哦
然后在定时器中用“GetExitCodeProcess”api来检测调用的外部应用程序(就是cmd.exe)是否结束了运行。
示例如下
Private Declare Function OpenProcess Lib "Kernel32" (ByVal dwDesiredAccess _
As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "Kernel32" _
(ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function GetExitCodeProcess Lib "Kernel32" _
(ByVal hProcess As Long, lpExitcode As Long) As Long
Private Declare Function CloseHandle Lib "Kernel32" (ByVal hobject As Long) As LongPrivate RetProcess As Double
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const STATUS_PENDING = &H103&
Private hProcess As Long, Exitcode As LongRetProcess = Shell("cmd.exe d:\user.bat", vbNormalFocus)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, RetProcess)'用定时器检测进程是否退出
Private Sub TimerProcess_Timer()
TimerProcess.Enabled = False
Call GetExitCodeProcess(hProcess, Exitcode)
If Exitcode <> STATUS_PENDING Then
'进程已关闭
Call CloseHandle(hProcess)
TimerProcess.Enabled = False
Else
'进程未关闭
TimerProcess.Enabled = True
End If
End Sub
"cmd.exe d:\user.bat"这个我不怎么懂?
然后运行的时候发现还是老样子,我一把cmd.exe的窗口移动,vb窗口就会出现一个白框框,和程序没响应一样。
vc中用WaitForMultipleObjects来同时等待消息和让当前程序处理本程序消息队列的消息。
不过vb因是以单线程为主,不知能否用WaitForSingleObject。
我觉得最好还是在定时器中进行查询。
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, RetProcess)
这一段是放在General里面吗?