首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

vc 模拟卸载程序,怎么在程序运行时删除exe文件自身

2012-08-17 
vc 模拟卸载程序,如何在程序运行时删除exe文件自身是这样,我在模拟一个卸载程序,由于是客户定制,不能用Ins

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 自己。
程序最后调用这个批处理文件。

热点排行