進程無法直接刪除自己的可執行文件(文件被鎖定)。經典解法:啟動隱藏的 `cmd.exe /c del <自身路徑>`,主進程退出後由命令行進程完成刪除。
BOOL SelfDel() {
SHELLEXECUTEINFO sei = {0};
TCHAR szModule[MAX_PATH], szComspec[MAX_PATH], szParams[MAX_PATH];
if (GetModuleFileName(0, szModule, MAX_PATH) &&
GetShortPathName(szModule, szModule, MAX_PATH) &&
GetEnvironmentVariable(_T("COMSPEC"), szComspec, MAX_PATH)) {
lstrcpy(szParams, _T("/c del "));
lstrcat(szParams, szModule);
lstrcat(szParams, _T(" > nul"));
sei.cbSize = sizeof(sei);
sei.hwnd = 0;
sei.lpVerb = _T("open");
sei.lpFile = szComspec;
sei.lpParameters = szParams;
sei.nShow = SW_HIDE;
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
if (ShellExecuteEx(&sei)) {
SetPriorityClass(sei.hProcess, IDLE_PRIORITY_CLASS);
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, szModule, 0);
return TRUE;
}
}
return FALSE;
}
邏輯相同,調用 `ShellExecuteEx`,注意結構體初始化與字符串拼接。代碼較長,此處略。