在 Windows 程式設計中啟動外部程式/開啟檔案,歷經 system()、WinExec()、ShellExecute()、ShellExecuteEx() 多代演進。本文深度比較前兩者,並說明為何現代開發應首選 ShellExecute()。
UINT WinExec(LPCSTR lpCmdLine, UINT uCmdShow);
參數:
lpCmdLine:命令列字串 (含程式路徑與參數)uCmdShow:視窗顯示狀態 (SW_SHOWNORMAL、SW_HIDE、SW_MAXIMIZE 等)回傳值:成功 > 31,失敗代碼對應錯誤 (0=記憶體不足, 2=找不到檔案, 3=找不到路徑, 11=格式錯誤)。
侷限性:
HINSTANCE ShellExecute(
HWND hwnd, // 父視窗句柄 (用於錯誤對話框)
LPCTSTR lpOperation, // 動作: "open", "print", "explore", ""(預設)
LPCTSTR lpFile, // 目標檔案/URL/可執行檔
LPCTSTR lpParameters,// 參數 (僅 lpFile 為 exe 時有效)
LPCTSTR lpDirectory, // 工作目錄
INT nShowCmd // 顯示狀態 (同 WinExec)
);
強大功能:
ShellExecute(hwnd, "", "doc.pdf", "", "", SW_SHOWNORMAL) 自動啟動 PDF 閱讀器ShellExecute(hwnd, "", "https://example.com", "", "", SW_SHOWNORMAL) 呼叫預設瀏覽器mailto:user@domain.com、ftp://... 等lpOperation="explore", lpFile="C:\\Windows"lpOperation="print", lpFile="doc.txt"回傳值:> 32 成功,≤ 32 為錯誤代碼 (需查 ShellExecuteEx 文件對應)。
需求:用記事本開啟 C:\HDC.TXT
// WinExec - 必須知道程式路徑與參數格式
WinExec("notepad c:\\hdc.txt", SW_SHOWNORMAL);
// ShellExecute - 利用 .txt 關聯,更簡潔健壯
ShellExecute(Handle, "", "c:\\hdc.txt", "", "", SW_SHOWNORMAL);
// 或明確指定
ShellExecute(Handle, "open", "notepad", "c:\\hdc.txt", "", SW_SHOWNORMAL);
表單放置兩個 Label:
lbHomepage:Caption https://www.example.com,藍色底線字體lbEMail:Caption mailto:contact@example.comClick 事件:
ShellExecute(Handle, "", lbHomepage->Caption.c_str(), "", "", SW_SHOWNORMAL);
ShellExecute(Handle, "", lbEMail->Caption.c_str(), "", "", SW_SHOWNORMAL);
即刻實現專業級超連結 UI,無需第三方元件。
提供 SHELLEXECUTEINFO 結構體,支援:
SEE_MASK_NOCLOSEPROCESS + WaitForSingleObject)缺點:結構複雜、不支援 Windows NT 早期版本。除非需要進階控制,否則 ShellExecute 已足夠 95% 場景。
ShellExecuteWinExec 漸進式替換ShellExecuteEx + SEE_MASK_NOCLOSEPROCESSlpOperation = "runas"xdg-open/open理解 Shell 命名空間與檔案關聯機制,是 Windows 開發者的必修課。