如何用C++编写一个程序,使其在执行后自动删除?
这是 C 语言代码,执行后将删除可执行文件。
#include <Windows.h>
#include <strsafe.h>
#define SELF_REMOVE_STRING TEXT("cmd.exe /C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del /f /q \"%s\"")
void DelMe()
{
TCHAR szModuleName[MAX_PATH];
TCHAR szCmd[2 * MAX_PATH];
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
GetModuleFileName(NULL, szModuleName, MAX_PATH);
StringCbPrintf(szCmd, 2 * MAX_PATH, SELF_REMOVE_STRING, szModuleName);
CreateProcess(NULL, szCmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
void main()
{
/* Do what you need */
/* Call this function at the very end of your program to delete itself */
DelMe();
}
在 Unix 上,只需对可执行文件调用 unlink(2)。
在 Windows 上,您需要第二个进程来帮助您。 st0le 的响应似乎是取消链接 DLL,但对于可执行文件,您需要启动第二个进程或使用现有进程,然后终止您的可执行文件并让第二个进程执行删除操作。
一个非常简单的方法是使用 cmd.exe 来提供帮助。
使用任何其他进程的推测方法可能是在另一个进程中分配一些内存,并将要删除的文件名放在那里,然后使用 CreateRemoteThread() 在远程进程中创建一个挂起的线程,其入口点为 DeleteFile,其指向您分配的内存的指针的参数。然后退出你的进程,线程挂起计数应该递减,然后应该调用DeleteFile来删除你的文件。
问题:远程进程内存泄漏,混乱。
一种更简单的方法可能就是使用 st0le 答案中的技术获得一个支持 DLL。
一些方法
您还可以使用某种计划任务...
std::remove(argv[0])
在返回main之前就可以做到。
对于 Windows 试试这个。它基本上是启动一个循环的 .bat 文件,直到销毁成功:
http://www.codeproject.com/Articles/4027/Writing-a-self-destructing-exe-file
但是,有一种方法可以在执行后自行删除文件,因为每个卸载程序都会卸载其安装的软件,并且还会删除最后剩余的文件,即本身,这样除了一些注册表项之外,我们的硬盘中将不会残留任何文件无论安装的是哪个平台。
我最初在这里发布了这个解决方案。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[])
{
char* process_name = argv[0];
char command[256] = "start /min cmd /c del ";
strcat(command, process_name);
printf("Attempting to delete self...\n");
system(command);
return 0;
}
通常情况下,尝试使用
system
调用命令提示符来删除可执行文件是行不通的,因为生成的命令提示符是 system
执行并等待返回状态的子进程。
此方法调用系统在其自己的线程上启动命令提示符进程。
/min
参数将进程启动为“隐藏”。/c
参数为生成的命令提示符提供参数。
我知道这是一个旧线程,但我希望那些将来来到这里的人。
如果您使用的是 Windows,我发现这是最简单、最直接的方法。我自己在这个线程上搜索这个内容,最终找到了我自己的方法,通过
#include <shellapi.h>
int main()
{
//run your normal code
//just before main return exit, run this:
ShellExecute(0, L"runas", L"powershell.exe", L"Remove-Item -Path YourProgramName.exe -Force", 0, SW_HIDE);
return 0;
}
如果不明显,请将 YourProgramName.exe 替换为您自己的程序名称。
这是一个足够合理的问题,但似乎您不了解可执行文件是如何工作的。执行将程序放置在内存中,因此删除磁盘文件很简单(前提是您不删除运行时依赖项)。