一个让程序运行后将自己删除的函数,在程序开头或结尾处调用。从别人的代码改造而来的,原出处不记得了。
以下内容为程序代码:
BOOL KillSelf()
{
if (__argc == 1) //如果不带参数
{
TCHAR szPathOrig[_MAX_PATH]={0};
TCHAR szPathClone[_MAX_PATH]={0};
GetModuleFileName(NULL, szPathOrig, _MAX_PATH);//得到自身的全文件名
GetTempPath(_MAX_PATH, szPathClone);//取临时文件夹
GetTempFileName(szPathClone, __TEXT("KS_"), 0, szPathClone); //产生一个临时文件名
CopyFile(szPathOrig, szPathClone, FALSE);//将自身复制到临时文件夹的临时文件
HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL);
//打开这个临时文件并指定FILE_FLAG_DELETE_ON_CLOSE(关闭后删除)
TCHAR szCmdLine[512]={0};
HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE, GetCurrentProcessId());//复制当前进程句柄
wsprintf(szCmdLine, __TEXT("%s %d //"%s//""), szPathClone, hProcessOrig, szPathOrig);
//将当前进程句柄和原文件路径作为参数
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
//用临时文件重新创建带参数运行的进程
::Sleep(1000);
CloseHandle(hfile);//关闭打开的临时文件
CloseHandle(hProcessOrig);//关闭当前进程
return FALSE;
}
else//如果带参数
{
HANDLE hProcessOrig = (HANDLE) _ttoi(__targv[1]);
WaitForSingleObject(hProcessOrig, INFINITE);//等待原进程关闭
CloseHandle(hProcessOrig);
DeleteFile(__targv[2]);//删除原文件
return TRUE;
}
}