首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 呼叫外部 Windows 程式三大技法:WinExec、ShellExecute、CreateProcess/TerminateProcess

     編輯:Delphi

介面佈局

四按鈕對應三種技法:WinExec、ShellExecute、CreateProcess(配合 TerminateProcess 關閉)。

技法對比與程式碼

1. WinExec(簡單、傳統)

procedure TForm1.btnWinExecClick(Sender: TObject);
begin
  WinExec('Notepad.exe', SW_MAXIMIZE); // 參數:命令列、顯示模式
end;

缺點:無法等待進程結束、無法取得進程控制碼、16 位元遺留 API(僅為相容保留)。

2. ShellExecute(文件關聯、功能豐富)

procedure TForm1.btnShellExecuteClick(Sender: TObject);
begin
  ShellExecute(Application.Handle, 'open', 'Notepad.exe',
    PChar('C:\AutoExec.bat'), nil, SW_SHOWNORMAL);
end;

優勢:自動依副檔名關聯啟動程式、支援 print/explore 等動詞、可傳遞參數與工作目錄。缺點:同樣無法精細控制子進程。

3. CreateProcess + TerminateProcess(完全控制)

var
  PI: TProcessInformation;
  SI: TStartupInfo;
  hProc: THandle;

procedure TForm1.btnCreateProcessOpenClick(Sender: TObject);
begin
  FillChar(SI, SizeOf(SI), 0);
  SI.cb := SizeOf(SI);
  SI.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
  SI.wShowWindow := SW_SHOW;
  CreateProcess('C:\WINNT\Notepad.exe', nil, nil, nil, True,
    DETACHED_PROCESS, nil, nil, SI, PI);
end;

procedure TForm1.btnCreateProcessCloseClick(Sender: TObject);
begin
  hProc := OpenProcess(PROCESS_ALL_ACCESS, False, PI.dwProcessId);
  TerminateProcess(hProc, 0);
  CloseHandle(hProc);
end;

優勢:取得進程/執行緒控制碼與 ID、可等待 (WaitForSingleObject) 、讀取退出碼、重導向標準輸入輸出、精確終止。為建立「程式超級連結」的專業選擇。

執行效果

前三按鈕均可啟動記事本;第四按鈕專門關閉由 CreateProcess 啟動的實例,不影響手動開啟的其他記事本視窗。

選型建議

場景推薦 API
單純啟動獨立程式、無需互動ShellExecute
需依文件關聯開啟/列印ShellExecute
需同步等待、取得退出碼、管道通訊、強制終止CreateProcess
極簡舊碼維護WinExec
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved