VC 中程序运行后删除自身

发布时间:2016年4月8日 作者:未知 查看次数:1159

VC 中程序运行后删除自身

参考自:http://www.cnblogs.com/morewindows/archive/2011/08/12/2136342.html

调用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()就完成了任务。

以上需要加入头文件及lib库
#include <windows.h>
#include <stdlib.h>
#include <shellapi.h>
#include <shlobj.h>
 
#pragma comment(lib, "shell32.lib")

 

 

 

========================================
注:上面代码在const char szDeleteBatText[] = "@ echo off\r\ndel %%1\r\ndel %%0";中多了%号,
用const char szDeleteBatText[] = "@ echo off\r\ndel %1\r\ndel %0";就可以了。

 

//*****************
//用于删除自身
int WriteTextToFile(const char szFileName[], const char *lpszText)
{
 DWORD tReadLen;
 HANDLE hFile;
 hFile=CreateFile(szFileName,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,NULL);
 WriteFile(hFile,lpszText,lstrlen(lpszText),&tReadLen,NULL);
 CloseHandle(hFile);
 return tReadLen;
}
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);
}
//用于删除自身
//*****************



版权所有!www.sieye.cn
E.Mail:sieye@sohu.com QQ:66697110