在應用程式中啟動另一個可執行檔,常見三種 API,功能由簡至繁:
WinExec —— 最簡單UINT WinExec(LPCSTR lpCmdLine, UINT uCmdShow);
// 範例:最大化啟動
WinExec(_T("D:\\Program Files\\zeecalls\\zeecalls.exe"), SW_SHOWMAXIMIZED);
CreateProcess。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);
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/O | CreateProcess |
| 需設定安全屬性、環境變數、繼承控制碼 | CreateProcess |
依專案複雜度選擇最適合的 API,避免過度設計或功能不足。