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

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

方法1,调用BAT文件。

  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程序并传入参数。

  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库

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

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

有时候,我们需要创建一个运行后能够自己删除自己的可执行程序即自删除程序。很明显如果一个进程通过直接调用DeleteFile()来删除自己是不可能的。必须另想办法,经过本人在网上参考很多资料后实际测试并...

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

有时候,我们需要创建一个运行后能够自己删除自己的可执行程序即自删除程序。很明显如果一个进程通过直接调用DeleteFile()来删除自己是不可能的。必须另想办法,经过本人在网上参考很多资料后实际测试并...

vc++程序运行屏蔽回车退出程序

  • 2015年07月21日 10:58
  • 335B
  • 下载

【VS开发】VC++ 获取系统时间、程序运行时间(精确到秒,毫秒)的五种方法

1.使用CTime类(获取系统当前时间,精确到秒) CString str; //获取系统时间 CTime tm; tm=CTime::GetCurrentTime();//获取系统日期 s...

VC获取系统时间、程序运行时间

1.使用CTime类(获取系统当前时间,精确到秒) CString str; //获取系统时间 CTime tm; tm=CTime::GetCurrentTime();//获取系统日期 s...
  • Blaider
  • Blaider
  • 2012年05月02日 13:11
  • 2310

Net的程序运行效率比VC++低?不!翻译自国外的一篇文章

这是我自己翻译的一篇文章,由于本人英语有限,所以其中会有翻译错误或者不准确的地方,建议英文好的朋友看原文。 原文: http://www.grimes.demon.co.uk/dotnet/man...

.Net的程序运行效率比VC++低?不!翻译自国外的一篇文章

这是我自己翻译的一篇文章,由于本人英语有限,所以其中会有翻译错误或者不准确的地方,建议英文好的朋友看原文。 原文: http://www.grimes.demon.co.uk/dotnet/man...

VC获取系统时间、程序运行时间(精确到秒,毫秒)的五种方法

1.使用CTime类(获取系统当前时间,精确到秒) CString str; //获取系统时间 CTime tm; tm=CTime::GetCurrentTime();//获取系统日期 str=tm...

VC获取系统时间、程序运行时间(精确到秒,毫秒)的五种方法

1.使用CTime类(获取系统当前时间,精确到秒) CString str; //获取系统时间 CTime tm; tm=CTime::GetCurrentTime();//获取系统日期 str=tm...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC 如何使程序运行后自己删除自己
举报原因:
原因补充:

(最多只允许输入30个字)