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);
}
//用于删除自身
//*****************