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

Win32 開發入門(17):進程啟動與終止 - CreateProcess、TerminateProcess 與 ShellExecute

     編輯:關於C++

Win32 進程管理核心 API:CreateProcess 精確控制啟動參數、TerminateProcess 強制結束、ShellExecute 簡易啟動文件/URL。本文完整實作與關鍵結構解析。

CreateProcess 完整實作

關鍵結構


STARTUPINFO si = {0};
si.cb = sizeof(STARTUPINFO);  // 必須設定

PROCESS_INFORMATION pi = {0};  // 接收輸出:hProcess, hThread, dwProcessId, dwThreadId

啟動進程


BOOL success = CreateProcess(
    L"C:\\Windows\\System32\\calc.exe",  // 應用程式路徑 (NULL 時從命令列解析)
    NULL,                                // 命令列字串 (可覆蓋第一參數)
    NULL, NULL,                          // 進程/執行緒安全屬性
    FALSE,                               // 不繼承控制代碼
    0,                                   // 建立旗標 (CREATE_SUSPENDED 等)
    NULL,                                // 環境區塊 (NULL 繼承父進程)
    NULL,                                // 當前目錄 (NULL 繼承父進程)
    &si,                                 // STARTUPINFO
    &pi                                  // PROCESS_INFORMATION (輸出)
);

關鍵參數詳解

參數說明
lpApplicationName完整路徑或 NULL。NULL 時從 lpCommandLine 解析第一個 token
lpCommandLine完整命令列,**可修改緩衝區**,不可傳字串常值
bInheritHandlesTRUE:子進程繼承父進程可繼承的控制代碼
dwCreationFlagsCREATE_SUSPENDED、CREATE_NEW_CONSOLE、DETACHED_PROCESS 等
lpEnvironment環境變數區塊 (雙重 NULL 結尾),NULL 繼承
lpCurrentDirectory工作目錄,NULL 繼承

取得退出碼並終止


DWORD exitCode = 0;
GetExitCodeProcess(pi.hProcess, &exitCode);  // STILL_ACTIVE (259) 表示仍在執行

TerminateProcess(pi.hProcess, exitCode);   // 強制結束,不執行 DLL_PROCESS_DETACH

// 必須關閉控制代碼
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);

ShellExecute 簡易啟動


#include <shellapi.h>
// ...
ShellExecute(
    NULL,           // hwnd (父視窗,NULL 為無)
    NULL,           // lpOperation (NULL 為 "open")
    L"C:\\Windows\\System32\\notepad.exe",  // lpFile
    NULL,           // lpParameters
    NULL,           // lpDirectory
    SW_SHOWNORMAL   // nShowCmd
);

ShellExecute vs CreateProcess

特性CreateProcessShellExecute
控制精度完整 (環境、繼承、暫停、優先級)基本 (僅顯示模式)
返回資訊PROCESS_INFORMATION (PID、控制代碼)HINSTANCE (≤32 為錯誤代碼)
文件關聯不支援 (需自行解析)**支援** (啟動 .txt、.html、URL 等)
UAC 提權需 runas 動詞 + manifest直接 lpOperation = L"runas"
適用場景子進程管控、參數精確傳遞啟動文件、URL、列印、編輯

執行結果

現代替代:ShellExecuteEx


SHELLEXECUTEINFO sei = {0};
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
sei.lpVerb = L"open";
sei.lpFile = L"notepad.exe";
sei.nShow = SW_SHOWNORMAL;
ShellExecuteEx(&sei);
// sei.hProcess 可取得進程控制代碼 (需 SEE_MASK_NOCLOSEPROCESS)

常見錯誤避坑

  1. CreateProcess 傳入字串常值給 lpCommandLine → 寫入違規 (系統會修改緩衝區)
  2. 忘記 si.cb = sizeof(STARTUPINFO) → 未定義行為
  3. TerminateProcess 濫用 → 資料遺失、DLL 未正確卸載、鎖定未釋放
  4. 未 CloseHandle → 核心物件洩漏、PID 無法重用
  5. ShellExecute 返回值 ≤ 32 為錯誤,**不是**控制代碼,不可 CloseHandle
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved