四按鈕對應三種技法:WinExec、ShellExecute、CreateProcess(配合 TerminateProcess 關閉)。
procedure TForm1.btnWinExecClick(Sender: TObject);
begin
WinExec('Notepad.exe', SW_MAXIMIZE); // 參數:命令列、顯示模式
end;
缺點:無法等待進程結束、無法取得進程控制碼、16 位元遺留 API(僅為相容保留)。
procedure TForm1.btnShellExecuteClick(Sender: TObject);
begin
ShellExecute(Application.Handle, 'open', 'Notepad.exe',
PChar('C:\AutoExec.bat'), nil, SW_SHOWNORMAL);
end;
優勢:自動依副檔名關聯啟動程式、支援 print/explore 等動詞、可傳遞參數與工作目錄。缺點:同樣無法精細控制子進程。
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 |