Shell & Wait 的程式怎麼寫?
希望某一 VB 程式利用 Shell 執行某一個外部程式(假設是 notepad.exe)之後, 就一直等到此一程式結束執行時, 才回到 VB 程式繼續執行, 該怎麼辦到呢?
當我們呼叫 Shell 時, 會傳回一個數值, 此一數值稱為 Process Id, 利用此一 Process Id, 我們可以呼叫 OpenProcess API 取得 Process Handle, 然後再利用 Process Handle 呼叫 WaitForSingleObject, 即可等待被 Shell 執行的程式執行完畢, 才繼續向下執行。細節如下:
1. 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
註:如果以上的宣告放在「一般模組」底下, 應將 Declare 之前的 Private 保留字去掉, 並且在 Const 之前加上 Public 保留字。
2. 程式範例:(以執行 Notepad 程式為例)
Dim pId As Long, pHnd As Long ' 分別宣告 Process Id 及 Process Handle 變數 pId = Shell("Notepad", vbNormalFocus) ' Shell 傳回 Process Id pHnd = OpenProcess(SYNCHRONIZE, 0, pId) ' 取得 Process Handle If pHnd <> 0 Then Call WaitForSingleObject(pHnd, INFINITE) ' 無限等待,直到程式結束 Call CloseHandle(pHnd) End If