進程與執行緒是 Windows 執行體的基本單位。API 涵蓋建立/終止、同步物件 (事件、互斥體、訊號、可等待計時器)、進程間通訊 (管道、郵槽、命名管道)、動態連結庫載入、優先權控制、資訊查詢等完整生命週期管理。本文依功能分類整理核心函式,並說明關鍵參數與常見陷阱。
| 函式 | 用途 | 關鍵參數/備註 |
|---|---|---|
| CreateProcess / CreateProcessAsUser / CreateProcessWithLogonW | 建立新進程 (完整/偽裝/指定認證) | lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags (CREATE_SUSPENDED, DETACHED_PROCESS, CREATE_NEW_CONSOLE...), lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation |
| ExitProcess / TerminateProcess | 正常結束/強制終止進程 | TerminateProcess 不執行 DLL_PROCESS_DETACH,慎用 |
| GetExitCodeProcess | 取得結束代碼 (STILL_ACTIVE=259 表仍在執行) | |
| WinExec / ShellExecute / ShellExecuteEx | 簡易執行/文件關聯啟動/進階啟動 | ShellExecuteEx 支援動詞 (open/edit/print/runas)、等待、視窗狀態 |
| LoadModule | 16-bit 相容載入 (已淘汰) | 勿用於新開發 |
| 函式 | 用途 |
|---|---|
| CreateThread / CreateRemoteThread | 建立本地/遠端執行緒 |
| ExitThread / TerminateThread | 正常結束/強制終止 (強制終止會洩漏資源、破壞關鍵區) |
| GetExitCodeThread | 取得執行緒結束代碼 |
| GetCurrentThread / GetCurrentThreadId | 取得偽控制代碼/真實 ID |
| GetThreadPriority / SetThreadPriority | 優先權級別 (THREAD_PRIORITY_IDLE ~ TIME_CRITICAL) |
| GetThreadTimes / GetProcessTimes | 核心/使用者/建立/結束 時間 (FILETIME) |
| SuspendThread / ResumeThread | 暫停/恢復計數器 (巢狀) |
| SwitchToThread | 自願讓出時間片 |
| GetThreadContext / SetThreadContext / Wow64Get/SetThreadContext | 完整 CPU 內容存取 (除錯器/效能分析) |
| 類型 | 建立 | 等待/通知 | 適用場景 |
|---|---|---|---|
| 事件 | CreateEvent / CreateEventEx | SetEvent / PulseEvent / ResetEvent / WaitForSingleObject | 單次/持續訊號通知、手動/自動重置 |
| 互斥體 | CreateMutex / CreateMutexEx | WaitForSingleObject / ReleaseMutex | 跨進程互斥、擁有權遞歸、放棄檢測 (WAIT_ABANDONED) |
| 訊號 | CreateSemaphore / CreateSemaphoreEx | WaitForSingleObject / ReleaseSemaphore | 資源計數控制 (連線池、緩衝區槽位) |
| 可等待計時器 | CreateWaitableTimer / CreateWaitableTimerEx | SetWaitableTimer / CancelWaitableTimer | 高精度週期/單次觸發、喚醒系統、APC 完成例程 |
| 關鍵區 | InitializeCriticalSection / InitializeCriticalSectionEx | EnterCriticalSection / TryEnterCriticalSection / LeaveCriticalSection | 進程內高效互斥、自旋計數、遞歸 |
| SRW Lock | InitializeSRWLock | Acquire/Release SRWLock Exclusive/Shared | Vista+ 讀寫鎖、無擁有權、極輕量 |
| 條件變數 | InitializeConditionVariable | SleepConditionVariableCS/SRW / WakeConditionVariable/Single/All | Vista+ 高效等待/通知模式 |
| 函式 | 用途 | 備註 |
|---|---|---|
| WaitForSingleObject / WaitForSingleObjectEx | 等待單一物件 (含 Alertable) | Ex 版支援 APC 完成例程 |
| WaitForMultipleObjects / WaitForMultipleObjectsEx | 等待多個物件 (ALL/ANY) | 最多 64 個控制代碼 |
| MsgWaitForMultipleObjects / MsgWaitForMultipleObjectsEx | 等待物件 + 訊息佇列 (GUI 執行緒必備) | 避免 UI 凍結,支援輸入/事件/計時器訊息 |
| WaitOnAddress / WakeByAddressSingle/All | Win8+ 位址等待/喚醒 (用戶模式輕量同步) | 無核心物件開銷,適合高爭用計數器 |
| 機制 | 核心函式 | 特性 |
|---|---|---|
| 匿名管道 | CreatePipe | 父子進程單向、生命週期綁定父進程 |
| 命名管道 | CreateNamedPipe / ConnectNamedPipe / DisconnectNamedPipe / CallNamedPipe | 雙向、跨網路 (SMB)、模擬用戶端身分、訊息/位元組模式 |
| 郵槽 | CreateMailslot / ReadFile / WriteFile | 單向廣播、不可靠、支援網路廣播 |
| 檔案映射 (共享記憶體) | CreateFileMapping / MapViewOfFile / UnmapViewOfFile | 高速大量資料共享、支援大型檔案、安全描述元控制 |
| 函式 | 用途 |
|---|---|
| LoadLibrary / LoadLibraryEx | 載入 DLL (Ex 旗標: LOAD_WITH_ALTERED_SEARCH_PATH, LOAD_LIBRARY_AS_DATAFILE...) |
| GetProcAddress | 取得匯出函式位址 |
| FreeLibrary / FreeLibraryAndExitThread | 釋放 DLL (引用計數歸零時真正卸載) |
| GetModuleHandle / GetModuleHandleEx | 取得已載入模組基址 |
| DisableThreadLibraryCalls | 停用 DLL_THREAD_ATTACH/DETACH 通知 (效能優化) |
| 函式 | 用途 |
|---|---|
| GetPriorityClass / SetPriorityClass | 進程優先權類別 (IDLE, BELOW_NORMAL, NORMAL, ABOVE_NORMAL, HIGH, REALTIME) |
| GetProcessWorkingSetSize / SetProcessWorkingSetSize | 工作集大小 (實體記憶體配額) |
| GetProcessShutdownParameters / SetProcessShutdownParameters | 關機順序優先權 |
| SetProcessAffinityMask / GetProcessAffinityMask | 處理器親和性 (指定可執行核心) |
| 函式 | 用途 |
|---|---|
| GetCurrentProcess / GetCurrentProcessId | 偽控制代碼 / 真實 ID |
| GetWindowThreadProcessId | 視窗所屬執行緒/進程 ID |
| OpenProcess / OpenThread | 依 ID 取得具權限控制代碼 |
| EnumProcesses / EnumProcessModules / EnumProcessModulesEx | PSAPI/Toolhelp32 列舉系統進程/模組 |
| GetProcessImageFileName / GetModuleFileNameEx | 進程/模組完整路徑 (需 PROCESS_QUERY_LIMITED_INFORMATION) |
lpApplicationName 為 NULL 時,lpCommandLine 第一個 token 為模組名,含空格需雙引號包裹;引號嵌套需轉義。WM_CLOSE/CTRL_C_EVENT。LoadLibraryEx 指定 LOAD_WITH_ALTERED_SEARCH_PATH 或使用完整路徑,啟用 SetDefaultDllDirectories (Win8+) 限制搜尋目錄。GetWindowThreadProcessId 回傳 DWORD 執行緒 ID,進程 ID 亦為 DWORD;指標大小相關結構使用 ULONG_PTR。std::thread, std::mutex, std::condition_variable, std::counting_semaphore, std::jthread (RAII 自動 join)。concurrency::task, parallel_for, agent 等高階平行模式。Windows::System::DispatcherQueue, ThreadPool 等現代非同步模型。進程與執行緒 API 是 Windows 系統程式設計的基石。掌握建立/終止流程、同步物件選型 (關鍵區 vs 互斥體 vs SRW Lock vs 條件變數)、等待模式 (Alertable vs MsgWait)、IPC 機制特性、DLL 載入安全性,並遵循現代 C++ RAII 與標準庫優先原則,即可構建高效、穩健、可維護的並發應用程式。