delphi啟動外部程式執行結束

2021-07-13 21:47:45 字數 3477 閱讀 6826

一、為什麼要啟動外部程式

二、預備知識

啟動外部程式我們可以使用函式winexec、shellexecute和shellexecuteex。我推薦大家使用函式shellexecute,因為它既靈活,又簡單。看看下面的例子,用法就清楚了:

*: 啟動乙個程式

nil,nil,sw_show);

* 啟動記事本 (因為記事本在系統路徑下,所以不必寫完整的路徑名了):

shellexecute(handle, 'open', pchar('notepad'),

nil, nil, sw_show);

* 啟動記事本並載入乙個純文字檔案:

shellexecute(handle, 'open', pchar('notepad'),

pchar('c: est eadme.txt', nil, sw_show);

* 使用記事本開啟乙個純文字檔案 (請確定*.txt檔案被關聯到記事本):

shellexecute(handle, 'open', pchar('c: est eadme.txt'),

nil, nil, sw_show);

* 使用預設瀏覽器開啟**:

shellexecute(handle, 'open', pchar(''),

nil, nil, sw_show);

* 列印乙個檔案:

shellexecute(handle, 'print', pchar('c: est eadme.txt'),

nil, nil, sw_show);

* 用windows explorer開啟乙個資料夾:

shellexecute(handle, 'explore', pchar('c:windows)',

nil, nil, sw_show);

* 執行乙個dos命令並立即返回:

shellexecute(handle, 'open', pchar('command.com'),

pchar('/c copy file1.txt file2.txt'), nil, sw_show);

* 執行乙個dos命令並保持dos視窗開啟 ("stay in dos"):

shellexecute(handle, 'open', pchar('command.com'),

pchar('/k dir'), nil, sw_show);

啟動乙個外部程式並不難吧?不過,我們如何知道它是否執行結束了呢?我們的程式又怎樣等待它結束呢?

三、啟動外部程式並等待它結束的函式

我們可以通過程序控制代碼(process handle)來檢視程序(程式)是否結束。為了得到程序控制代碼,有兩個win32 api函式可以利用:shellexecuteex 或者createproces。解決這個問題最簡單的方法是,使用shellexecuteex啟動乙個外部程式,然後使用waitforsingleobject管理這個外部程式的程序控制代碼。我們可以這樣定義乙個函式:

……returns:如果外部程式出錯返回 fasle}……

varshellexinfo: tshellexecuteinfo;

begin

fillchar(shellexinfo, sizeof(shellexinfo), 0);

with shellexinfo do begin

cbsize := sizeof(shellexinfo);

fmask := see_mask_nocloseprocess;

lpparameters := pchar(params);

nshow := sw_shownormal;

end;

result := shellexecuteex(@shellexinfo);

if result then

while waitforsingleobject(shellexinfo.hprocess, 100) = wait_timeout do

begin

end;

end;

……不難理解吧?

建立乙個unit execwait,把上面的**輸進去。

四、例子

unit demounit;

inte***ce

uses

windows, messages, sysutils, classes, graphics, controls,

forms, dialogs, stdctrls, shellapi;

type

tform1 = class(tform)

edit1: tedit;

edit2: tedit;

label1: tlabel;

label2: tlabel;

btnexec: tbutton;

checkboxwait: tcheckbox;

label3: tlabel;

label4: tlabel;

edit3: tedit;

edit4: tedit;

label5: tlabel;

procedure btnexecclick(sender: tobject);

private

public

end;

varform1: tform1;

implementation

uses

execwait;

procedure tform1.btnexecclick(sender: tobject);

varsuccess: boolean;

instanceid: thandle;

begin

success := false;

tryif checkboxwait.checked then

else begin

instanceid := shellexecute(handle, 'open', pchar(edit1.text),

pchar(edit2.text), nil, sw_show);

success := instanceid >= 32; // 小於32可就錯了

end;

finally

// 可別忘了恢復我們的程式的視窗!

if not success then

end;

tryif checkboxwait.checked then

else begin

instanceid := shellexecute(handle, 'open', pchar(edit3.text),

pchar(edit4.text), nil, sw_show);

success := instanceid >= 32; //小於32可就錯了

end;

finally

//恢復我們的程式的視窗

if not success then

end;

end;

end.

ok,沒有問題吧?你趕快試試吧,把它應用到你的程式裡。

Delphi啟動外部程式

無論是用vc還是用delphi,啟動外部程式,呼叫的都是相同的系統中的api函式,如下delphi 所示 登入按鈕 procedure tform1.label loginclick sender tobject begin end delphi啟動其它程式函式 begin 使用winexec也可以...

啟動外部程式

啟動外部程式我們可以使用函式winexec shellexecute和shellexecuteex。我推薦大家使用函式shellexecute,因為它既靈活,又簡單。看看下面的例子,用法就清楚了 啟動乙個程式 shellexecute handle,open lpcstr d 模擬程式.exe nu...

使用Delphi啟動和關閉外部應用程式

delphi與windows 平台緊密結合,編譯 快速高效。作為一種視覺化的物件導向開發工具,delphi可以幫助程式設計師更輕鬆 更快速地編寫各種windows應用程式。而且通過程式設計可以方便地呼叫其它語言編寫的動態庫或應用程式,並在不需要時關閉這些外部程式。這一點對許多程式設計人員非常有用,例...