VC 如何使程序运行后自己删除自己

有时候,我们需要创建一个运行后能够自己删除自己的可执行程序即自删除程序。很明显如果一个进程通过直接调用DeleteFile()来删除自己是不可能的。必须另想办法,经过本人在网上参考很多资料后实际测试并集众家之所长,发现有二种方法效果比较好。现在将其封装成函数,这样使用将更加容易:

方法1,调用BAT文件。

[cpp]  view plain copy
  1. //向指定文件写入文本。如果文件不存在就创建。  
  2. int WriteTextToFile(const char szFileName[], const char *lpszText)  
  3. {  
  4.     FILE *pfile = fopen(szFileName, "w+");  
  5.     if (pfile == NULL)  
  6.         return -1;  
  7.     int nWriteByte = fprintf(pfile, lpszText);  
  8.     fclose(pfile);  
  9.     return nWriteByte;  
  10. }  
  11. void DeleteApplicationSelf()  //可以达到效果  
  12. {  
  13.     const char szFileName[] = "DeleteBat.bat";//使用批处理  
  14.     const char szDeleteBatText[] = "@ echo off\n del %%1\"\n del %%0";  
  15.       
  16.     //创建BAT文件并写入内容  
  17.     WriteTextToFile(szFileName, szDeleteBatText);  
  18.       
  19.     //设置本程序进程基本为实时执行,快速退出。  
  20.     SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);  
  21.     SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);  
  22.     //通知资源管理器不显示本程序,当然如果程序没有真正的删除,刷新资源管理器后仍会显示出来的。  
  23.     SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, _pgmptr, NULL);  
  24.       
  25.     //运行bat文件来删除程序  
  26.     char szFilePath[MAX_PATH];  
  27.     sprintf(szFilePath, "\"%s\"", _pgmptr);  
  28.     ShellExecute(NULL, "open""DeleteBat.bat", szFilePath, NULL, SW_HIDE);  
  29.       
  30.     ExitProcess(0);  
  31. }  

调用起来非常方便:直接一个DeleteApplicationSelf()就完成了任务。

 

方法二。调用系统的cmd程序并传入参数。

[cpp]  view plain copy
  1. void DeleteApplicationSelf()  
  2. {  
  3.     char szCommandLine[MAX_PATH + 10];  
  4.       
  5.     //设置本程序进程基本为实时执行,快速退出。  
  6.     SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);  
  7.     SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);  
  8.     //通知资源管理器不显示本程序,当然如果程序没有真正的删除,刷新资源管理器后仍会显示出来的。  
  9.     SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, _pgmptr, NULL);  
  10.       
  11.     //调用cmd传入参数以删除自己  
  12.     char szFilePath[MAX_PATH];  
  13.     sprintf(szFilePath, "\"%s\"", _pgmptr);  
  14.     sprintf(szCommandLine, "/c del /q %s", szFilePath);  
  15.     ShellExecute(NULL, "open""cmd.exe", szCommandLine, NULL, SW_HIDE);  
  16.       
  17.     ExitProcess(0);  
  18. }  

调用方法与前面相同。

 

这二种方法都不会出现DOS程序窗口,完全达到了无影无踪的删除效果,更加不会出现有的程序自删除后仍显示程序图标,要刷新资源管理器后才发现程序被删除了。

 

再对代码作下讲解:

1._pgmptr 的定义为extern char * _pgmptr,stdlib.h文件对其说明为:points to the module (EXE) name。使用_pgmptr与使用GetModuleFileName(NULL, szExePath, MAX_PATH);来得到程序的路径是等效的。但是,绝对要加上""双引号后才能作参数传给批处理程序,不然会出错。

2.ShellExecute()最后一个参数为SW_HIDE表示隐藏窗口。

3.DOS命令del的/q参数表示安静模式,这样删除文件时就不会出现要求用户确认的提示对话框了。

 

附:二种方法都要加入头文件及lib库

[cpp]  view plain copy
  1. #include <windows.h>  
  2. #include <stdlib.h>  
  3. #include <shellapi.h>  
  4. #include <shlobj.h>  
  5.   
  6. #pragma comment(lib, "shell32.lib")  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值