天天看點

判斷ShellExecute函數是否執行完一個程式的方法本文為原創,如需轉載,請注明作者和出處,謝謝!

    注意:本文讨論的是使用ShellExecute函數同步執行exe或其他可執行檔案,本文隻是介紹了一個技巧,雖然可以使用ShellExecuteEx函數以及WaitForSingleObject等方法實作同步執行,但在不會使用ShellExecuteEx函數的情況下,也不失為一種救急的解決方案。

    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 

判斷ShellExecute函數是否執行完一個程式的方法本文為原創,如需轉載,請注明作者和出處,謝謝!

其他指令行參數

del temp.txt

假設我們使用delphi來通過ShellExecute函數來運作bcp指令,代碼如下:

FileCreate("temp.txt");

ShellExecute(

判斷ShellExecute函數是否執行完一個程式的方法本文為原創,如需轉載,請注明作者和出處,謝謝!

,"bcp.cmd",

判斷ShellExecute函數是否執行完一個程式的方法本文為原創,如需轉載,請注明作者和出處,謝謝!

,);

while true do

begin

   if temp.txt不存在 then

   begin 

      //  bcp已成功執行

       break;

   end;

end;

//  後續的處理代碼