VC程序自删除
有時候,我們需要創建一個運行后能夠自己刪除自己的可執行程序即自刪除程序。很明顯如果一個進程通過直接調用DeleteFile()來刪除自己是不可能的。必須另想辦法,經過本人在網上參考很多資料后實際測試并集眾家之所長,發現有二種方法效果比較好。現在將其封裝成函數,這樣使用將更加容易:
?
方法1,調用BAT文件。
//向指定文件寫入文本。如果文件不存在就創建。
int WriteTextToFile(const char szFileName[], const char *lpszText)
{
?????? FILE *pfile = fopen(szFileName, "w+");
?????? if (pfile == NULL)
????????????? return -1;
?????? int nWriteByte = fprintf(pfile, lpszText);
?????? fclose(pfile);
?????? return nWriteByte;
}
void DeleteApplicationSelf()?
{
?????? const char szFileName[] = "DeleteBat.bat"; //使用批處理
?????? const char szDeleteBatText[] = "@ echo off\r\ndel %%1\r\ndel %%0";
?
?????? //創建BAT文件并寫入內容
?????? WriteTextToFile(szFileName, szDeleteBatText);
?
?????? //設置本程序進程基本為實時執行,快速退出。
?????? SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
?????? SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
?????? //通知資源管理器不顯示本程序,當然如果程序沒有真正的刪除,刷新資源管理器后仍會顯示出來的。
??? SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, _pgmptr, NULL);
??????
?????? //運行bat文件來刪除程序
?????? ShellExecute(NULL, "open", "DeleteBat.bat", _pgmptr, NULL, SW_HIDE);
?
?????? ExitProcess(0);
}
調用起來非常方便:直接一個DeleteApplicationSelf()就完成了任務。
?
方法二。調用系統的cmd程序并傳入參數。
void DeleteApplicationSelf()
{
?????? char szCommandLine[MAX_PATH + 10];
?
?????? //設置本進程為實時執行,快速退出。
?????? SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
?????? SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
?????? //通知資源管理器不顯示本程序,當然如果程序沒有真正的刪除,刷新資源管理器后仍會顯示出來的。
??? SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, _pgmptr, NULL);
??????
?????? //調用cmd傳入參數以刪除自己
?????? sprintf(szCommandLine, "/c del /q %s", _pgmptr);
?????? ShellExecute(NULL, "open", "cmd.exe", szCommandLine, NULL, SW_HIDE);
?
?????? ExitProcess(0);
}
調用方法與前面相同。
?
這二種方法都不會出現 DOS程序窗口,完全達到了無影無蹤的刪除效果,更加不會出現有的程序自刪除后仍顯示程序圖標,要刷新資源管理器后才發現程序被刪除了。總結
- 上一篇: VC异形窗体
- 下一篇: VC获取父进程PID