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

C++ 啟動外部程式的三種方式:WinExec、ShellExecute、CreateProcess 比較

     編輯:VC 教學

前言

在 Windows 桌面應用程式中,常需要啟動另一個執行檔。最常見的三個 API 分別是 WinExec、ShellExecute、CreateProcess。本文以啟動 D:\Program Files\zeecalls\zeecalls.exe 為例,比較三者的用法、參數靈活度與回傳資訊。

1. WinExec(最簡單,已棄用)

UINT WinExec(LPCSTR lpCmdLine, UINT uCmdShow);
// 僅支援 ANSI 字串,無法取得進程資訊
WinExec("D:\\Program Files\\zeecalls\\zeecalls.exe", SW_SHOWMAXIMIZED);
  • 優點:呼叫極簡單,兩行參數。
  • 缺點:已被標記為過時(建議改用 CreateProcess);無法指定工作目錄、環境變數、安全屬性;無法取得新進程的 Handle/ID;路徑含空白需自行加雙引號。

2. ShellExecute / ShellExecuteEx(較彈性,適合開啟文件/網址)

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);
  • 優點:可指定「動作」(open、print、edit)、工作目錄、顯示模式;支援關聯開啟(如 .txt、.html、https://);回傳值大於 32 表示成功。
  • 缺點:同樣無法取得進程 Handle/ID;無法控制進程建立旗標(如 CREATE_SUSPENDED、DETACHED_PROCESS);非同步啟動,呼叫後無法得知進程何時真正啟動。

3. CreateProcess(功能最完整,建議正式專案使用)


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 可進一步同步、監控、終止進程。
  • 缺點:參數較多,初學者易出錯;需自行處理字串編碼(Unicode/ANSI)、路徑引號。

選擇建議

需求推薦 API
快速原型、簡單啟動 exeShellExecute
需指定工作目錄、動作、顯示模式ShellExecuteEx
需取得進程 Handle/ID、等待結束、重導向 I/O、調整安全性CreateProcess
舊碼維護、極簡單呼叫WinExec(僅限維護)

結語

現代 Windows 開發應以 CreateProcess 為首選,ShellExecute/Ex 適合開啟文件或網址,WinExec 僅供舊碼參考。掌握三者差異,能依專案需求選擇最適合的啟動方式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved