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

VC++ 啟動外部程式三大 API 比較:WinExec、ShellExecute、CreateProcess

     編輯:VC++

概述

在應用程式中啟動另一個可執行檔,常見三種 API,功能由簡至繁:

1. WinExec —— 最簡單

UINT WinExec(LPCSTR lpCmdLine, UINT uCmdShow);

// 範例:最大化啟動
WinExec(_T("D:\\Program Files\\zeecalls\\zeecalls.exe"), SW_SHOWMAXIMIZED);
  • 僅支援命令列字串與顯示模式。
  • 無法取得進程資訊,錯誤處理有限。
  • 屬舊版 API,新專案建議改用 CreateProcess。

2. ShellExecute —— 彈性較高

HINSTANCE ShellExecute(HWND hwnd, LPCTSTR lpOperation,
    LPCTSTR lpFile, LPCTSTR lpParameters,
    LPCTSTR lpDirectory, INT nShowCmd);

// 範例:正常視窗啟動
ShellExecute(NULL, _T("open"), _T("zeecalls.exe"),
    NULL, _T("D:\\Program Files\\zeecalls\\"), SW_SHOWNORMAL);
  • 可指定動作(open、print、explore 等)。
  • 可關聯文件類型(如 .txt、.html)由系統決定開啟程式。
  • 回傳值 > 32 表示成功,否則為錯誤碼。

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:控制主視窗位置、大小、標準輸入/輸出/錯誤控制碼等。
  • PROCESS_INFORMATION:回傳進程與主執行緒控制碼、ID,便於後續 WaitForSingleObject、GetExitCodeProcess 等控制。

範例:正常啟動並取得進程資訊

PROCESS_INFORMATION pi;
STARTUPINFO si = { sizeof(STARTUPINFO) };
si.wShowWindow = SW_SHOW;
si.dwFlags = STARTF_USESHOWWINDOW;

bool ok = CreateProcess(
    _T("D:\\Program Files\\zeecalls\\zeecalls.exe"),
    NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

if (ok)
{
    // 可使用 pi.hProcess, pi.dwProcessId 等
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
}

選擇建議

需求建議 API
單純啟動 .exe,無需控制ShellExecute(優於 WinExec)
需開啟文件關聯程式ShellExecute
需取得進程控制碼、同步等待、重導向 I/OCreateProcess
需設定安全屬性、環境變數、繼承控制碼CreateProcess

依專案複雜度選擇最適合的 API,避免過度設計或功能不足。

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