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

來源:互聯網
上載者:User

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;
//  後續的處理代碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.