程序自己删除自己的方法,基本都是借助第三方删除。要不然只有把自己添加到重启后删除,或者在退出之前将自己移动到垃圾箱去(使用MoveFileEx,特别注意第三个参数)。
下面介绍借助第三方删除自己,代码如下:![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
void DeleteSelfByCmd() { char szCommandLine[MAX_PATH] = { 0}; sprintf(szCommandLine, "/c ping 127.0.0.1 -n 1 && del /f/q \"%s\"", _pgmptr); // 将自己设置为快速退出 SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); ShellExecute(NULL, "open", "cmd.exe", szCommandLine, NULL, SW_HIDE); ExitProcess(0); } void DeleteSelfByFile() { // 以批处理bat文件为例 const char szFileName[] = "DeleteBat.bat"; char szDeleteBatText[MAX_PATH]; ZeroMemory(szDeleteBatText, MAX_PATH); wsprintfA(szDeleteBatText, "ping 127.0.0.1 -n 1\r\ndel /q \"%s\"\r\ndel %%0", _pgmptr); HANDLE hDelBatFile = CreateFileA(szFileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hDelBatFile) { CloseHandle(hDelBatFile); hDelBatFile = NULL; return; } DWORD dwWrite(0); if (0 == WriteFile(hDelBatFile, szDeleteBatText, strlen(szDeleteBatText), &dwWrite, NULL)) { CloseHandle(hDelBatFile); hDelBatFile = NULL; return; } CloseHandle(hDelBatFile); hDelBatFile = NULL; // 将自己设置为快速退出 SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); ShellExecute(NULL, "open", "DeleteBat.bat", _pgmptr, NULL, SW_HIDE); ExitProcess(0); }
其中为了确保第三方能删除自己,最好将自己设置为快速退出(),另外也可以在第三方中加入延时。
另外,也可以通过vbs脚本删除自己,思路和通过bat文件删除自己一致,vbs文件内容如下:![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
Set ObjFSO = CreateObject("Scripting.FileSystemObject") If IsExitAFile("D:\\test.tst") // 判断文件是否存在 Then DeleteAFile("D:\\test.tst") ObjFSO.DeleteFile Wscript.ScriptFullName // 删除自己,Wscript.ScriptFullName返回脚本的实际路径
需头文件#include <shellapi.h>
【参考资料 感谢作者】。。。当时忘了记录