| 旗標 | 效果 |
| CREATE_SUSPENDED | 主執行緒建立後暫停,需 ResumeThread 繼續(適合注入/除錯) |
| DETACHED_PROCESS | 無主控台,不繼承父主控台 |
| CREATE_NEW_CONSOLE | 建立新主控台視窗 |
| CREATE_NO_WINDOW | 無視窗(適用 GUI 程式隱藏執行) |
| HIGH_PRIORITY_CLASS / IDLE_PRIORITY_CLASS | 設定行程優先權類別 |
| DEBUG_PROCESS / DEBUG_ONLY_THIS_PROCESS | 以除錯器身分啟動 |
| CREATE_UNICODE_ENVIRONMENT | 環境區塊為 Unicode |
STARTUPINFO 關鍵欄位
cb:必須設為 sizeof(STARTUPINFO),否則失敗。
dwFlags:指定後續欄位生效,如 STARTF_USESHOWWINDOW (配合 wShowWindow)、STARTF_USESTDHANDLES (配合 hStdInput/Output/Error 實現管道重導向)。
wShowWindow:SW_HIDE/SW_SHOW/SW_MINIMIZE 等。
常見應用模式
1. 簡單啟動外部程式
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
CreateProcess(NULL, _T("notepad.exe my.txt"), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess); // 不等待結束
2. 匿名管道重導向子行程輸出
SECURITY_ATTRIBUTES sa = { sizeof(sa), NULL, TRUE };
HANDLE hRead, hWrite;
CreatePipe(&hRead, &hWrite, &sa, 0);
SetHandleInformation(hRead, HANDLE_FLAG_INHERIT, 0); // 父端不可繼承
STARTUPINFO si = { sizeof(si) };
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = si.hStdError = hWrite;
si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
PROCESS_INFORMATION pi;
CreateProcess(NULL, cmdLine, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
CloseHandle(hWrite); // 關鍵:父端關閉寫入端,否則 ReadFile 永不返回 EOF
char buf[4096]; DWORD dwRead;
while (ReadFile(hRead, buf, sizeof(buf)-1, &dwRead, NULL) && dwRead) {
buf[dwRead] = 0; printf("%s", buf);
}
CloseHandle(hRead);
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess); CloseHandle(pi.hThread);
3. 等待子行程結束並取得返回碼
WaitForSingleObject(pi.hProcess, INFINITE);
DWORD exitCode;
GetExitCodeProcess(pi.hProcess, &exitCode);
資源清理鐵律
必須 呼叫 CloseHandle(pi.hProcess) 和 CloseHandle(pi.hThread),否則洩漏核心物件。若用 CREATE_SUSPENDED,記得 ResumeThread 後再關閉執行緒控制代碼。
- 上一篇文章: 多執行緒程式設計必要性:行程與執行緒差異、資源共享與效能分析
- 下一篇文章: MFC 執行緒控制全解析:CWinThread、UI 執行緒與工作執行緒實作模式
Copyright ©
程式碼之家 All Rights Reserved