1. 程式人生 > >判斷ShellExecute函式是否執行完一個程式的方法

判斷ShellExecute函式是否執行完一個程式的方法

    ShellExecute是windows的API函式,功能是執行可執行檔案(exe)或任何關聯檔案(doc、txt、xls等)。但ShellExecute是非同步執行的,也就是說,不管執行的程式是否成功執行,執行的時間是長是短,ShellExecute函式都會立即返回。這樣雖然可以很好地完成執行程式的工作,但卻會給後續的工作帶來麻煩。
    例如,當呼叫bcp命令向sql server匯入資料後,在DBGrid中顯示這些匯入的資料。如果使用ShellExecute來直接執行bcp命令,很可能會在資料未完全匯入時顯示DBGrid。這樣就會造成資料顯示不完整或根本顯示不出來資料。
    要解決這個問題的方法就是使ShellExecute變成同步直接的,解決方法很多,例如,可以判斷彈出的控制檯視窗是否已關閉來確定bcp是否執行完。但這樣做還會有一些問題,例如,如果執行根本沒有彈出視窗的程式,那這種方法就不起作用了。而本書給出了另一種比較通用的方法。基本原理是利用了批處理檔案的特性。雖然ShellExecute是非同步執行的,但批處理是同步執行的,也就是在.bat、.cmd、.sh(linux/unix)中的命令是一個接一個順序執行的。因此,我們可以採用在批處理檔案中呼叫bcp命令的方法來實現同步呼叫。也就是說,可以在呼叫bcp之前,先中當前目錄中建立一個檔案或空目錄,然後呼叫bcp,最後再刪除這個檔案或目錄。這樣可以通過判斷檔案或目錄是否存在來確定bcp是否執行完成。為了確保在呼叫ShellExecute之前檔案一定存在,可以在呼叫ShellExecute之前在程式中建立一個檔案,在批處理中刪除這個檔案。下面是一個批處理檔案的例子。


批處理檔名:bcp.cmd
set path = <bcp.exe的本地路徑>/bcp.exe
bcp %1 in %2 %3 %4 其他命令列引數
del temp.txt

假設我們使用delphi來通過ShellExecute函式來執行bcp命令,程式碼如下:

FileCreate("temp.txt");
ShellExecute(,"bcp.cmd",,);
while true do
begin
   if temp.txt不存在 then
   begin 
      //  bcp已成功執行       break;
   end;
end;
//  後續的處理程式碼