使用Shell指令具有Wait的功能
在vb中,Shell指令经常被用来执行外部程序。但是,在外部进程被创建后,它会立即返回到VB中的下一行程序。不可能等到流程结束再执行下一行指令。换句话说,无法知道进程是否已经结束,或者如何在中途停止进程的执行。这些都是Shell指令无法控制的,所以我们需要API的帮助来完成。
第一个问题是如何在执行vb程序之前等待shell创建的进程完成。首先要知道,每个进程都有一个ProcessID,ProcessID是OS给的,用来区分每个进程。该进程ID(PID)主要用于获取与进程对应的一些信息。但是,要控制进程,主要是通过进程句柄(h Process)。VB指令的返回值是PID,不是hProcess,所以我们需要通过OpenProcess的API来获取hProcess,而OpenProcess()的第一个参数指的是获取的hProcess的能力。例如,PROCESS_QUERY_INFORMATION使GetExitCode()能够获得hProcess所指示的进程状态,而PROCESS_TERMINATE则使TerminateProcess(hProcess)的指令生效..)才能生效,也就是不同的参数设置使得hProcess的权限和能力不同。获得hProcess后,可以使用WaitForSingleObject()等待hProcess状态的变化,也就是说,它会等待hProcess指示的进程结束,这条指令就结束了。它的第二个参数是WaitForSingleObject()的等待时间(以毫秒为单位)。如果超过指示的时间,它将超时并结束WaitForSingleObject()的等待。要无限期等待,请将其设置为INFINITE。
PID = Shell(" C:\ tools \ SPE 3 \ pe2 . exe ",vbNormalFocus)
h PROCESS = open PROCESS(PROCESS _ QUERY _ INFORMATION,0,PID)
exit event = WaitForSingleObject(h PROCESS,INFINITE)
Call close handle(h PROCESS)
在最后一次会议上,我们将无限期地等待shell指令create的进程结束,然后再执行下面的vb指令。有时候我觉得等待时间会太长,于是有了第二种解决方案:只要等到进程结束再通知vb,也就是设置一个公共变量(isDone),当它变成True的时候,就意味着Shell创建的进程被绑定了。当流程仍在运行时,GetExitCodeProcess会将&H103传递给它的第二个参数,直到最后才会传递另一个值。如果程序正常结束,那么Exitcode = 0,否则就看如何结束了。可能别人在其他地方看到循环的地方就是ExitCode < > 0时的循环,有点危险。如果你使用右上角x的结束dos窗口而不是F4来离开pe2,你将进入一个无限循环,因为退出代码的值永远不会是0。
dim PID As Long
PID = Shell(" C:\ tools \ SPE 3 \ pe2 . exe ",vbNormalFocus)
h PROCESS = open PROCESS(PROCESS _ QUERY _ INFORMATION,0,PID)
isDone = False
Do
Call GetExitCodeProcess(h PROCESS,ExitCode)
Debug。当exit code = STILL _ ALIVE
Call close handle(h process)
is done = True时,打印ExitCode
DoEvents
循环
此外,如果由您的shell创建的程序有一个窗口并立即成为焦点,您可以使用下面的方法:dim PID as long
dimhwnd 5 as long
PID = shell(" C:\ tools \ SPE 3 \ pe2 . exe "),vbNormalFocus)
hwnd 5 = GetForegroundWindow()
isDone = False
Do While is window(hwnd 5)
Do events
Loop
isDone =
以及如何强制shell创建的进程结束,即
dimaa long
if hprocess 0 then
aa = termin ate process(hprocess,3838)
end if
0条评论