進程是 Windows 執行程式的基本單位,擁有獨立虛擬位址空間、程式碼、資料與核心物件。本文說明進程結構、CreateProcess 參數詳解、進程狀態查詢與強制終止,並提供 MASM 範例實作選單驅動的進程建立/終止控制。
CreateThread 增加執行緒;CreateProcess 則建立全新進程CreateProcess proto lpApplicationName:DWORD,
lpCommandLine:DWORD,
lpProcessAttributes:DWORD,
lpThreadAttributes:DWORD,
bInheritHandles:DWORD,
dwCreationFlags:DWORD,
lpEnvironment:DWORD,
lpCurrentDirectory:DWORD,
lpStartupInfo:DWORD,
lpProcessInformation:DWORD
| 參數 | 說明 | 常用值 |
|---|---|---|
| lpApplicationName | 執行檔完整路徑(可為 NULL) | NULL 或 "C:\Path\App.exe" |
| lpCommandLine | 命令列字串(若 lpApplicationName=NULL 則必含檔名) | "notepad.exe readme.txt" |
| lpProcessAttributes / lpThreadAttributes | 安全屬性 | NULL(預設) |
| bInheritHandles | 子進程是否繼承父進程開啟控制碼 | FALSE |
| dwCreationFlags | 建立旗標:優先權、除錯、暫停啟動等 | NORMAL_PRIORITY_CLASS |
| lpEnvironment | 環境區塊指標 | NULL(繼承父進程) |
| lpCurrentDirectory | 子進程目前目錄 | NULL(繼承父進程) |
| lpStartupInfo | STARTUPINFO 結構,控制視窗外觀 | GetStartupInfo 填充 |
| lpProcessInformation | 輸出 PROCESS_INFORMATION 結構 | 接收 hProcess, hThread, dwProcessId, dwThreadId |
PROCESS_INFORMATION STRUCT
hProcess HANDLE ? ; 進程控制碼(非唯一識別碼)
hThread HANDLE ? ; 主執行緒控制碼
dwProcessId DWORD ? ; 進程 ID(系統唯一)
dwThreadId DWORD ? ; 主執行緒 ID
PROCESS_INFORMATION ENDS
注意:進程控制碼非唯一識別碼,不可用於跨程序比對身分;進程 ID 才是唯一值。
GetExitCodeProcess(hProcess, &ExitCode):ExitCode == STILL_ACTIVE (259) 表進程仍在執行。TerminateProcess(hProcess, uExitCode):強制終止,不會通知已載入 DLL,可能導致資源洩漏,僅作最後手段。CloseHandle 釋放核心物件參考計數。主視窗選單提供「Create Process」與「Terminate Process」。啟動時呼叫 CreateProcess 執行 msgbox.exe,終止前以 GetExitCodeProcess 確認存活。WM_INITMENUPOPUP 動態啟用/灰化選單項反映進程狀態。
.ELSEIF uMsg==WM_INITMENUPOPUP
invoke GetExitCodeProcess, processInfo.hProcess, ADDR ExitCode
.if eax==TRUE
.if ExitCode==STILL_ACTIVE
invoke EnableMenuItem, hMenu, IDM_CREATE_PROCESS, MF_GRAYED
invoke EnableMenuItem, hMenu, IDM_TERMINATE, MF_ENABLED
.else
invoke EnableMenuItem, hMenu, IDM_CREATE_PROCESS, MF_ENABLED
invoke EnableMenuItem, hMenu, IDM_TERMINATE, MF_GRAYED
.endif
.else
invoke EnableMenuItem, hMenu, IDM_CREATE_PROCESS, MF_ENABLED
invoke EnableMenuItem, hMenu, IDM_TERMINATE, MF_GRAYED
.endif
.if ax==IDM_CREATE_PROCESS
.if processInfo.hProcess!=0
invoke CloseHandle, processInfo.hProcess
mov processInfo.hProcess, 0
.endif
invoke GetStartupInfo, ADDR startInfo
invoke CreateProcess, ADDR programname, NULL, NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, ADDR startInfo, ADDR processInfo
invoke CloseHandle, processInfo.hThread ; 不需主執行緒控制碼,立即關閉
.elseif ax==IDM_TERMINATE
invoke GetExitCodeProcess, processInfo.hProcess, ADDR ExitCode
.if ExitCode==STILL_ACTIVE
invoke TerminateProcess, processInfo.hProcess, 0
.endif
invoke CloseHandle, processInfo.hProcess
mov processInfo.hProcess, 0
GetStartupInfo 取得父進程啟動參數,傳給子進程保持一致外觀。CloseHandle;進程控制碼需保留以供後續查詢/終止,最後於 WM_DESTROY 或終止時關閉。CreateProcess 返回值檢查,實務上必須驗證。DLL_PROCESS_DETACH,可能遺留共享記憶體、檔案鎖定等資源,僅在必要時使用。掌握 CreateProcess 複雜參數、PROCESS_INFORMATION 欄位語意、進程狀態查詢與終止機制,並養成嚴格的控制碼管理習慣,是開發多進程 Windows 應用程式的基礎能力。