vc 模拟卸载程序,如何在程序运行时删除exe文件自身
是这样,我在模拟一个卸载程序,由于是客户定制,不能用Installsheild;
基本功能都已经正常,现在有个问题,运行卸载程序时,没法将卸载程序(uninstall.exe)自己删除;
网上查了基本是两个版本的,试了都没用;
HMODULE module = GetModuleHandle(0);
CHAR buf[MAX_PATH];
GetModuleFileName(module, buf, sizeof buf);
CloseHandle(HANDLE(4));
__asm {
lea eax, buf
push 0
push 0
push eax
push ExitProcess
push module
push DeleteFile
push UnmapViewOfFile
ret
}
请高人指点~~~~
[解决办法]
我有几点建议,你可以试一试:
1.把uninstall.exe名字先替换成一个别名可以用GUID代替,然后用MoveFileEx函数再下次登录时删除此文件。
2.利用脚本删除,uninstall.exe退出前启动脚本,利用它删除。
楼主所采用的方法在XP是不起作用的,那是很早的一种方法,是利用文件映射原理做得。
[解决办法]
完整的自删除代码,在vc6.0下编译通过。
#include "windows.h"
#include "stdio.h"
#include "shlobj.h"
BOOL SelfDell();
void main(void)
{
SelfDell();
return;
}
BOOL SelfDell()
{
SHELLEXECUTEINFO sei;
TCHAR szModule[MAX_PATH],szComspec[MAX_PATH],szParams[MAX_PATH];
if((GetModuleFileName(0,szModule,MAX_PATH) != 0) &&(GetEnvironmentVariable("COMSPEC",szComspec,MAX_PATH) !=0))
{
lstrcpy(szParams,"/c del");
lstrcat(szParams,szModule);
lstrcat(szParams," > nul");
sei.cbSize = sizeof(sei);
sei.hwnd = 0;
sei.lpVerb = "Open";
sei.lpFile = szComspec;
sei.lpParameters = szParams;
sei.lpDirectory = 0;
sei.nShow = SW_HIDE;
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
if(ShellExecuteEx(&sei))
{
SetPriorityClass(sei.hProcess,IDLE_PRIORITY_CLASS);
SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL);
SHChangeNotify(SHCNE_DELETE,SHCNF_PATH,szModule,0);
//AfxMessageBox("SUicide!");
return TRUE;
}
}
return FALSE;
}
借你拿去用一下,不行请致电www.ywh987912@163.com
[解决办法]
可以利用MoveFileEx等用重启以后删除自己这个exe
[解决办法]
把自己复制到临时文件中,然后在临时文件夹中运行,删除原目录的那个文件
[解决办法]
4楼的看着不错~
[解决办法]
- C/C++ code
#include <windows.h>void deleteMe(); int main(int argc, char* argv[]){ deleteMe(); return 0;}void deleteMe(){ char cmdline[1024]; GetEnvironmentVariable("ComSpec",cmdline,1024); GetModuleFileName(GetModuleHandle(0),cmdline+lstrlen(lstrcat(cmdline," /c del \"")),512); WinExec(cmdline,0);}
[解决办法]
http://www.catch22.net/tuts/selfdel
这篇文章提供了不少方法
[解决办法]
up
[解决办法]
都是高手。上面的几种方法都试验一次,找一种自己最喜欢的就行。
[解决办法]
写个批处理,del 自己。
程序最后调用这个批处理文件。