如何用C ++编写程序,以便在执行后自行删除?
答案 0 :(得分:20)
这是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();
}
答案 1 :(得分:5)
一些Methods
你也可以使用某种计划任务......
答案 2 :(得分:4)
在Unix上,只需在可执行文件上调用unlink(2)。
在Windows上,您需要第二个过程来帮助您。来自st0le的响应似乎是用于取消链接DLL,但对于可执行文件,您需要启动第二个进程或使用现有进程,然后终止可执行文件并让第二个进程执行删除。
一种非常简单的方法是使用cmd.exe来帮助。
使用任何其他进程的推测方法可能是在另一个进程中分配一些内存并将要删除的文件名放在那里,然后使用CreateRemoteThread()在远程进程中创建一个挂起的线程,其入口点为DeleteFile带有指向您分配的内存的指针的参数。然后退出进程,线程挂起计数应该递减,然后调用DeleteFile来删除你的文件。
问题:远程进程中的内存泄漏,很乱。
更简单的方法可能是使用st0le的答案中的技术来获得支持DLL。
答案 3 :(得分:1)
std::remove(argv[0])
可以做到。
答案 4 :(得分:0)
然而,有一种方法可以在执行后自行删除文件,因为每个Uninstaller都会取消由它安装的软件。还会删除最后一个剩余的文件,即本身,除了某些注册表项以外,我们的硬盘中不会保留任何文件,无论其安装的平台如何。
答案 5 :(得分:0)
对于Windows试试这个。它基本上是启动一个循环的.bat文件,直到销毁成功为止:
http://www.codeproject.com/Articles/4027/Writing-a-self-destructing-exe-file
答案 6 :(得分:0)
我最初发布了此解决方案 here。
#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
参数为生成的命令提示符提供参数。
我知道这是一个旧线程,但我希望那些将来会来到这里。
答案 7 :(得分:-3)
这是一个合法的问题,但似乎你不明白可执行文件是如何工作的。执行将程序放在内存中,因此删除磁盘文件是微不足道的(前提是您不删除运行时依赖项)。