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

Win32 行程控制實戰:CreateProcess 參數詳解與常見應用模式

     編輯:關於C語言

CreateProcess 完整原型與參數解析

BOOL CreateProcess(
    LPCTSTR lpApplicationName,        // 模組名稱(可為 NULL,由命令列解析)
    LPTSTR lpCommandLine,             // 完整命令列字串(可修改,故非 LPCTSTR)
    LPSECURITY_ATTRIBUTES lpProcessAttributes,  // 行程安全描述符,NULL 為預設
    LPSECURITY_ATTRIBUTES lpThreadAttributes,   // 主執行緒安全描述符
    BOOL bInheritHandles,             // TRUE:子行程繼承父行程可繼承控制代碼
    DWORD dwCreationFlags,            // 建立旗標組合
    LPVOID lpEnvironment,             // 新環境區塊,NULL 繼承父行程
    LPCTSTR lpCurrentDirectory,       // 子行程工作目錄,NULL 繼承父行程
    LPSTARTUPINFO lpStartupInfo,      // 啟動資訊(視窗狀態、標準控制代碼等)
    LPPROCESS_INFORMATION lpProcessInformation // 輸出:行程/執行緒控制代碼與 ID
);

關鍵旗標 dwCreationFlags 組合

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 後再關閉執行緒控制代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
旗標效果
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