在 Windows 桌面應用程式中,常需要啟動另一個執行檔。最常見的三個 API 分別是 WinExec、ShellExecute、CreateProcess。本文以啟動 D:\Program Files\zeecalls\zeecalls.exe 為例,比較三者的用法、參數靈活度與回傳資訊。
UINT WinExec(LPCSTR lpCmdLine, UINT uCmdShow);
// 僅支援 ANSI 字串,無法取得進程資訊
WinExec("D:\\Program Files\\zeecalls\\zeecalls.exe", SW_SHOWMAXIMIZED);
CreateProcess);無法指定工作目錄、環境變數、安全屬性;無法取得新進程的 Handle/ID;路徑含空白需自行加雙引號。HINSTANCE ShellExecute(
HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile,
LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd);
// 以正常視窗開啟 exe
ShellExecute(NULL, _T("open"), _T("zeecalls.exe"), NULL,
_T("D:\\Program Files\\zeecalls"), SW_SHOWNORMAL);
CREATE_SUSPENDED、DETACHED_PROCESS);非同步啟動,呼叫後無法得知進程何時真正啟動。
BOOL CreateProcess(
LPCTSTR lpApplicationName, LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles, DWORD dwCreationFlags,
LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation);
STARTUPINFO si = { sizeof(si) };
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
PROCESS_INFORMATION pi;
BOOL ok = CreateProcess(
_T("D:\\Program Files\\zeecalls\\zeecalls.exe"), // lpApplicationName
NULL, // lpCommandLine
NULL, NULL, // 安全屬性
FALSE, // 不繼承 Handle
0, // 建立旗標
NULL, // 環境變數
NULL, // 當前目錄
&si, &pi); // 輸出資訊
if (ok) {
// pi.hProcess、pi.hThread、pi.dwProcessId、pi.dwThreadId 皆可用
CloseHandle(pi.hThread); // 不需等待執行緒時立即關閉
// 可用 WaitForSingleObject(pi.hProcess, INFINITE) 等待結束
CloseHandle(pi.hProcess);
}
PROCESS_INFORMATION 可進一步同步、監控、終止進程。| 需求 | 推薦 API |
|---|---|
| 快速原型、簡單啟動 exe | ShellExecute |
| 需指定工作目錄、動作、顯示模式 | ShellExecuteEx |
| 需取得進程 Handle/ID、等待結束、重導向 I/O、調整安全性 | CreateProcess |
| 舊碼維護、極簡單呼叫 | WinExec(僅限維護) |
現代 Windows 開發應以 CreateProcess 為首選,ShellExecute/Ex 適合開啟文件或網址,WinExec 僅供舊碼參考。掌握三者差異,能依專案需求選擇最適合的啟動方式。