| 類型 | 全稱 | 入口點函數 | 字符集 |
| GUI | Graphical User Interface | WinMain / wWinMain | ANSI / Unicode |
| CUI | Console User Interface | main / wmain | ANSI / Unicode |

啟動函數:入口點前由 CRT 執行初始化(堆/IO/全局構造),入口點返回後執行清理(析構/IO刷新)再調用 ExitProcess。
CreateProcess 完整原型與參數詳解
BOOL CreateProcess(
LPCWSTR lpApplicationName, // 可執行文件路徑(NULL 時從命令行解析)
LPWSTR lpCommandLine, // 命令行字符串(可修改)
LPSECURITY_ATTRIBUTES lpProcessAttributes, // 進程安全屬性(NULL=默認不可繼承)
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 主線程安全屬性
BOOL bInheritHandles, // TRUE=子進程繼承可繼承句柄
DWORD dwCreationFlags, // 創建標誌組合
LPVOID lpEnvironment, // 環境塊指針(NULL=繼承父進程)
LPCWSTR lpCurrentDirectory, // 當前目錄(NULL=繼承父進程)
LPSTARTUPINFOW lpStartupInfo, // 啟動信息(窗口狀態/標準句柄/桌面)
LPPROCESS_INFORMATION lpProcessInformation // 輸出:進程/線程句柄及ID
);
關鍵標誌 dwCreationFlags
| 標誌 | 含義 |
| CREATE_SUSPENDED | 主線程掛起創建,需 ResumeThread 繼續 |
| DETACHED_PROCESS | 無控制台 |
| CREATE_NEW_CONSOLE | 新建控制台窗口 |
| CREATE_UNICODE_ENVIRONMENT | 環境塊用 Unicode |
| DEBUG_PROCESS / DEBUG_ONLY_THIS_PROCESS | 調試器模式 |
| IDLE_PRIORITY_CLASS 等 | 優先級類別 |
進程創建內部流程
- 創建進程內核對象(引用計數 1),非進程本身,而是管理數據結構
- 分配虛擬地址空間,映射 EXE/DLL 代碼數據
- 創建主線程內核對象(引用計數 1)
- 主線程執行 CRT 啟動代碼 → 入口點函數
CreateProcess 返回 TRUE 不代表初始化完成,DLL 載入失敗會導致進程悄無聲息終止,父進程無感知
進程終止四種方式
| 方式 | 觸發者 | 清理行為 | 退出碼來源 |
| 主線程返回 | 入口點 return | C++析構、CRT清理、ExitProcess | 入口點返回值 |
| ExitProcess | 任意線程 | 無 C++ 析構、CRT 無清理、直接終止 | 參數 fuExitCode |
| TerminateProcess | 其他進程 | 無任何用戶態清理、內核強制回收 | 參數 uExitCode |
| 所有線程結束 | 系統檢測 | 最後一個線程退出碼 | 最後線程退出碼 |
最佳實踐
- 主線程務必用 return,保證 RAII 與 CRT 正確清理
- 主線程禁用 ExitProcess,繞過 C++ 析構
- 極少調用 TerminateProcess,僅用於無響應進程強殺
系統終止後處理流程
- 終止殘留線程
- 釋放用戶/GDI 對象,關閉內核對象句柄(其他進程持有的除外)
- 退出碼從
STILL_ACTIVE(259) 變為實際值
- 進程內核對象置有信號狀態
- 內核對象引用計數 -1(歸零時銷毀對象)
本文整理自「賣萌程序員」博客,原文地址:https://7677869.blog.51cto.com/7667869/1297643
- 上一篇文章: MDK (Keil) 實時更新 Watch 窗口變量值配置方法
- 下一篇文章: 深入理解 C++ 面向對象原理(一):繼承中的同名成員遮蔽與構造順序
Copyright ©
程式碼之家 All Rights Reserved