代碼嘗試用 `CloseHandle` 關閉進程,實際 `CloseHandle` 僅釋放句柄引用,不終止進程。結束進程需用 `TerminateProcess`。
| API | 作用 | 比喻 |
| OpenProcess | 獲取進程句柄(引用) | 向管理器申請一把鑰匙 |
| CloseHandle | 釋放句柄引用,減少引用計數 | 歸還鑰匙給管理器 |
| TerminateProcess | 強制結束進程執行 | 銷毀房間(進程本體) |
錯誤代碼邏輯
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
CloseHandle(hProcess); // 僅歸還鑰匙,進程仍在運行
// 應該:
TerminateProcess(hProcess, 0);
CloseHandle(hProcess); // 結束後再關閉句柄
正確查找並結束進程流程
// 1. 快照遍歷進程
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe32 = { sizeof(pe32) };
if (Process32First(hSnap, &pe32)) {
do {
if (_tcscmp(pe32.szExeFile, targetName) == 0) {
// 2. 打開進程獲取終止權限句柄
HANDLE hProc = OpenProcess(PROCESS_TERMINATE, FALSE, pe32.th32ProcessID);
if (hProc) {
// 3. 終止進程
TerminateProcess(hProc, 0);
// 4. 關閉句柄
CloseHandle(hProc);
}
}
} while (Process32Next(hSnap, &pe32));
}
CloseHandle(hSnap);
關鍵點
- `CloseHandle` 釋放的是應用層的句柄對象,不影響內核進程對象。
- 進程結束需內核介入(`TerminateProcess` 或 `ExitProcess`)。
- 句柄引用計數歸零時,內核自動釋放內核對象,但進程仍運行直至主線程退出或被終止。
- 上一篇文章: MyEclipse Web 項目目錄結構解析:Project 視圖 vs Navigator 視圖的差異
- 下一篇文章: MDK5 編譯 STM32 提示無法打開 core_cm3.c 解決方案
Copyright ©
程式碼之家 All Rights Reserved