怎样删除自己? 小弟做了一个卸载程序,需要删除自己,但是因为文件正在执行,所以总是没有办法删除,那位大虾指点一下迷津。比如:执行a.exe后,a.exe就被删除了。就这么简单的功能。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 赫赫,这一期的csdn开发高手中有关于这个问题的讨论。(不是在作广告:))结论是在win2000下这是行不通的(不敢断定),好象win98下有点指望倒是可以标记在系统下次启动时删除 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); } feeboby兄的方法在程序退出之前执行的确可以,谢谢feeboby提供这种方法,在系统空闲时执行系统删除操作,的确是一个可行的方法。但是程序只要在运行,就不能删除掉,我见过即使程序运行却仍然能够删除自己的卸载程序,不知道是怎么做的。我想应该是切断与系统的映像就可以删除自己了,不知道是否如此。大家提点! 在windows下好象可以用批处理来实现这个效果,先生成一个后缀为.bat的文件,该文件就是用来删除正在执行的这个文件,生成后执行该批处理文件并退出正在执行的文件,这样就可以达到删除的目的,在批处理文件的最后别忘了加上删除这个批处理文件自己的语句,因为在windows下批处理文件可以是自删除的! 批处理是可以,但是好像不是很好看呢,现在还用.bat感觉不是很好吧。有没有什么别的方法? 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); //新建一个使用后,就由操作系统自动删除的文件…………下面就自己做吧! 请问MainFrame类在一个VC工程中起什么角色啊 求MFC入门教程 找不到地方发贴啊~~急啊~~简单问题 大散分來者有份,大家都來支持珊珊啊……(四) 如何判断一个文件是否是图形文件格式 ADO 怎么就是连接不上数据库呢 ,在线等 请问如何在程序中加入帮助文件.chm 调用系统其它账户运行DOS命令的问题。 请问怎么改变窗口标题的高度? 如何把中文输入法中的字体变大? 怎样调试SPI(.dll)程序?等待高手回答。 急问treeview中点击某项响应问题
{
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);
}
我想应该是切断与系统的映像就可以删除自己了,不知道是否如此。大家提点!
有没有什么别的方法?
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); //新建一个使用后,就由操作系统自动删除的文件
…………
下面就自己做吧!