Shell的异步执行处理

Author: 郭丽华 Date: 1999年 第17期 13版

    利用VB的Shell语句可以调用外部程序,但因为Shell是异步执行的,如果当外部程序还没有完成任务,VB就会执行下一语句,这样往往会得到错误的结果。如果通过调用API函数GetExitCodeProcess和OpenProcess便能解决这一问题。
    Declare Function GetExitCodeProcess Lib ″kernel32″ Alias″GetExitCodeProcess″ (ByVal hProcess As Long, lpExitCode As Long) As Long
    Declare Function OpenProcess Lib ″kernel32″ Alias ″OpenProcess″(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Public Const Process_Query_Information = &H400
    Public Const Still_Active = &H103
    Dim strWinDir As String
    Dim pidNotepad As Long
    Dim hProcess As Long
    ……
    strWinDir = Environ(″windir″)
    pidNotepad = Shell(strWinDir & ″\notepad.exe″, vbNormalFocus)
    hProcess = OpenProcess(Process_Query_Information, False,pidNotepad)
    Do  GetExitCodeProcess hProcess, lngexitcode
    Do  Events
    Loop While lngexitcode = Still_Active
    ……
    以上实例的运行结果是,程序循环直到记事本程序退出,才会继续运行下面的VB程序,其中,strWinDir =Environ(″windir″)语句是通过环境变量获得当前系统的Window目录。这样就很好地解决了Shell语句的异步执行问题。