判斷一個32位程序是否結(jié)束

字號:

Windows 3.1允許程序員用GetModuleUsage()函數(shù)來測試一個程序或模塊是否仍在運(yùn)行。但在Windows95及Windows NT下,每個程序都獨(dú)立地運(yùn)行在單獨(dú)的環(huán)境中,因此就排除了測試過程的狀態(tài)。
    Microsoft 提供了少量的函數(shù),如:WaitForSingleObject和 WaitForMultipleObjects 來完成該功能。盡管如此,這些函數(shù)并不是時時都有效。舉例來說,如果你調(diào)用WaitForSingleObject函數(shù)監(jiān)測Internet Explorer的運(yùn)行,同時你又選擇了“幫助”菜單中的“教程”項,結(jié)果將會是系統(tǒng)死鎖,你不得不終止WaitForSingleObject函數(shù)的運(yùn)行。造成這種結(jié)果的 原因是你點(diǎn)選了“教程”后,會返回給Internet Explorer一個地址,告訴瀏覽器轉(zhuǎn)到下一個網(wǎng)址。這種情況通常發(fā)生在一個程序是由調(diào)用它的父程序中的一個過程或?qū)ο笏鶈?,反過來卻要等待父程序的結(jié)束。
    本文的目的就是要解決這個問題。
    Declare
    Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess&, ByVal bInherithandle&, ByVal dwProcessid&) As Long
    Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpexitcode As Long) As Long
    ' Required Constants
    Const STILL_ACTIVE = &H103
    Const PROCESS_QUERY_INFORMATION = &H400
    Code
    Sub ShellWait(cCommandLine As String)
    Dim hShell As Long
    Dim hProc As Long
    Dim lExit As Long
    hShell = Shell(cCommandLine, VBNormalFocus)
    hProc = OpenProcess(PROCESS_QUERY_INFORMATION, False, hShell)
    Do
    GetExitCodeProcess hProc, lExit
    DoEvents
    Loop While lExit = STILL_ACTIVE
    End Sub
    調(diào)用 ShellWait,控制權(quán)將不會交給一個過程,直到調(diào)用該過程的程序結(jié)束