判斷ShellExecute函數(shù)是否執(zhí)行完一個(gè)程序的方法
本文為原創(chuàng),如需轉(zhuǎn)載,請注明作者和出處,謝謝!
ShellExecute是windows的API函數(shù),功能是執(zhí)行可執(zhí)行文件(exe)或任何關(guān)聯(lián)文件(doc、txt、xls等)。但ShellExecute是異步執(zhí)行的,也就是說,不管執(zhí)行的程序是否成功運(yùn)行,運(yùn)行的時(shí)間是長是短,ShellExecute函數(shù)都會(huì)立即返回。這樣雖然可以很好地完成執(zhí)行程序的工作,但卻會(huì)給后續(xù)的工作帶來麻煩。例如,當(dāng)調(diào)用bcp命令向sql server導(dǎo)入數(shù)據(jù)后,在DBGrid中顯示這些導(dǎo)入的數(shù)據(jù)。如果使用ShellExecute來直接執(zhí)行bcp命令,很可能會(huì)在數(shù)據(jù)未完全導(dǎo)入時(shí)顯示DBGrid。這樣就會(huì)造成數(shù)據(jù)顯示不完整或根本顯示不出來數(shù)據(jù)。
要解決這個(gè)問題的方法就是使ShellExecute變成同步直接的,解決方法很多,例如,可以判斷彈出的控制臺窗口是否已關(guān)閉來確定bcp是否執(zhí)行完。但這樣做還會(huì)有一些問題,例如,如果執(zhí)行根本沒有彈出窗口的程序,那這種方法就不起作用了。而本書給出了另一種比較通用的方法。基本原理是利用了批處理文件的特性。雖然ShellExecute是異步執(zhí)行的,但批處理是同步執(zhí)行的,也就是在.bat、.cmd、.sh(linux/unix)中的命令是一個(gè)接一個(gè)順序執(zhí)行的。因此,我們可以采用在批處理文件中調(diào)用bcp命令的方法來實(shí)現(xiàn)同步調(diào)用。也就是說,可以在調(diào)用bcp之前,先中當(dāng)前目錄中建立一個(gè)文件或空目錄,然后調(diào)用bcp,最后再刪除這個(gè)文件或目錄。這樣可以通過判斷文件或目錄是否存在來確定bcp是否執(zhí)行完成。為了確保在調(diào)用ShellExecute之前文件一定存在,可以在調(diào)用ShellExecute之前在程序中建立一個(gè)文件,在批處理中刪除這個(gè)文件。下面是一個(gè)批處理文件的例子。
批處理文件名:bcp.cmd
set path = <bcp.exe的本地路徑>/bcp.exe
bcp %1 in %2 %3 %4
其他命令行參數(shù)
del temp.txt
bcp %1 in %2 %3 %4

del temp.txt
假設(shè)我們使用delphi來通過ShellExecute函數(shù)來運(yùn)行bcp命令,代碼如下:
FileCreate("temp.txt");
ShellExecute(
,"bcp.cmd",
,);
while true do
begin
if temp.txt不存在 then
begin
// bcp已成功執(zhí)行
break;
end;
end;
// 后續(xù)的處理代碼
ShellExecute(


while true do
begin
if temp.txt不存在 then
begin
// bcp已成功執(zhí)行
break;
end;
end;
// 后續(xù)的處理代碼
《Android開發(fā)完全講義(第2版)》(本書版權(quán)已輸出到臺灣)
http://product.dangdang.com/product.aspx?product_id=22741502
《Android高薪之路:Android程序員面試寶典 》http://book.360buy.com/10970314.html
新浪微博:http://t.sina.com.cn/androidguy 昵稱:李寧_Lining
posted on 2010-03-27 15:14 銀河使者 閱讀(2807) 評論(2) 編輯 收藏 所屬分類: delphi 、 原創(chuàng)