怎样删除自己?

FlyingFox007 2003-10-21 10:15:50
小弟做了一个卸载程序,需要删除自己,但是因为文件正在执行,所以总是没有办法删除,那位大虾指点一下迷津。
比如:执行a.exe后,a.exe就被删除了。就这么简单的功能。
...全文
201 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouqingyuan 2003-10-31
  • 打赏
  • 举报
回复
U
luofeitarget 2003-10-31
  • 打赏
  • 举报
回复
GetModuleFileName(NULL, szPathOrig, _MAX_PATH);//获得卸载程序名路径
GetTempPath(_MAX_PATH, szPathClone);
GetTempFileName(szPathClone, __TEXT("Del"), 0, szPathClone); //获得零时文件名
CopyFile(szPathOrig, szPathClone, FALSE); //拷贝
hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL); //新建一个使用后,就由操作系统自动删除的文件
…………
下面就自己做吧!
zhaoweidf 2003-10-21
  • 打赏
  • 举报
回复
以前看过一个高手写过 nt 下的,自己删除自己的程序...
你在网上找找,有很多的...有很多病毒代码都有
FlyingFox007 2003-10-21
  • 打赏
  • 举报
回复
批处理是可以,但是好像不是很好看呢,现在还用.bat感觉不是很好吧。
有没有什么别的方法?
Scott_Zheng 2003-10-21
  • 打赏
  • 举报
回复
在windows下好象可以用批处理来实现这个效果,先生成一个后缀为.bat的文件,该文件就是用来删除正在执行的这个文件,生成后执行该批处理文件并退出正在执行的文件,这样就可以达到删除的目的,在批处理文件的最后别忘了加上删除这个批处理文件自己的语句,因为在windows下批处理文件可以是自删除的!
icr_mio 2003-10-21
  • 打赏
  • 举报
回复
楼上程序果然可以,在哪里找的阿?
FlyingFox007 2003-10-21
  • 打赏
  • 举报
回复
feeboby兄的方法在程序退出之前执行的确可以,谢谢feeboby提供这种方法,在系统空闲时执行系统删除操作,的确是一个可行的方法。但是程序只要在运行,就不能删除掉,我见过即使程序运行却仍然能够删除自己的卸载程序,不知道是怎么做的。
我想应该是切断与系统的映像就可以删除自己了,不知道是否如此。大家提点!
skt01 2003-10-21
  • 打赏
  • 举报
回复
UP
feeboby 2003-10-21
  • 打赏
  • 举报
回复
BOOL SelfDelete()
{
TCHAR szModule [MAX_PATH],
szComspec[MAX_PATH],
szParams [MAX_PATH];

// get file path names:
if((GetModuleFileName(0,szModule,MAX_PATH)!=0) &&
(GetShortPathName(szModule,szModule,MAX_PATH)!=0) &&
(GetEnvironmentVariable("COMSPEC",szComspec,MAX_PATH)!=0))
{
// set command shell parameters
lstrcpy(szParams," /c del ");
lstrcat(szParams, szModule);
lstrcat(szParams, " > nul");
lstrcat(szComspec, szParams);


// set struct members
STARTUPINFO si={0};
PROCESS_INFORMATION pi={0};
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;

// increase resource allocation to program
SetPriorityClass(GetCurrentProcess(),
REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(),
THREAD_PRIORITY_TIME_CRITICAL);

// invoke command shell
if(CreateProcess(0, szComspec, 0, 0, 0,CREATE_SUSPENDED|
DETACHED_PROCESS, 0, 0, &si, &pi))
{
// suppress command shell process until program exits
SetPriorityClass(pi.hProcess,IDLE_PRIORITY_CLASS);
SetThreadPriority(pi.hThread,THREAD_PRIORITY_IDLE);

// resume shell process with new low priority
ResumeThread(pi.hThread);

// everything seemed to work
return TRUE;
}
else // if error, normalize allocation
{
SetPriorityClass(GetCurrentProcess(),
NORMAL_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(),
THREAD_PRIORITY_NORMAL);
}
}
return FALSE;
}

int WINAPI WinMain(HINSTANCE h, HINSTANCE b, LPSTR psz, int n)
{
SelfDelete();

return(0);

}
icr_mio 2003-10-21
  • 打赏
  • 举报
回复
赫赫,这一期的csdn开发高手中有关于这个问题的讨论。(不是在作广告:))

结论是在win2000下这是行不通的(不敢断定),好象win98下有点指望

倒是可以标记在系统下次启动时删除
smallcrocodile 2003-10-21
  • 打赏
  • 举报
回复
我没有做过!
感觉逻辑有问题,你既然删除了自己,又怎么能让自己执行起来

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧