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

字號(hào):

Windows 3.1允許程序員用GetModuleUsage()函數(shù)來(lái)測(cè)試一個(gè)程序或模塊是否仍在運(yùn)行。但在Windows95及Windows NT下,每個(gè)程序都獨(dú)立地運(yùn)行在單獨(dú)的環(huán)境中,因此就排除了測(cè)試過(guò)程的狀態(tài)。
    Microsoft 提供了少量的函數(shù),如:WaitForSingleObject和 WaitForMultipleObjects 來(lái)完成該功能。盡管如此,這些函數(shù)并不是時(shí)時(shí)都有效。舉例來(lái)說(shuō),如果你調(diào)用WaitForSingleObject函數(shù)監(jiān)測(cè)Internet Explorer的運(yùn)行,同時(shí)你又選擇了“幫助”菜單中的“教程”項(xiàng),結(jié)果將會(huì)是系統(tǒng)死鎖,你不得不終止WaitForSingleObject函數(shù)的運(yùn)行。造成這種結(jié)果的 原因是你點(diǎn)選了“教程”后,會(huì)返回給Internet Explorer一個(gè)地址,告訴瀏覽器轉(zhuǎn)到下一個(gè)網(wǎng)址。這種情況通常發(fā)生在一個(gè)程序是由調(diào)用它的父程序中的一個(gè)過(guò)程或?qū)ο笏鶈?dòng),反過(guò)來(lái)卻要等待父程序的結(jié)束。
    本文的目的就是要解決這個(gè)問(wèn)題。
    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)將不會(huì)交給一個(gè)過(guò)程,直到調(diào)用該過(guò)程的程序結(jié)束