小弟做了一个卸载程序,需要删除自己,但是因为文件正在执行,所以总是没有办法删除,那位大虾指点一下迷津。
比如:执行a.exe后,a.exe就被删除了。就这么简单的功能。

解决方案 »

  1.   

    赫赫,这一期的csdn开发高手中有关于这个问题的讨论。(不是在作广告:))结论是在win2000下这是行不通的(不敢断定),好象win98下有点指望倒是可以标记在系统下次启动时删除
      

  2.   

    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);

    }
      

  3.   

    feeboby兄的方法在程序退出之前执行的确可以,谢谢feeboby提供这种方法,在系统空闲时执行系统删除操作,的确是一个可行的方法。但是程序只要在运行,就不能删除掉,我见过即使程序运行却仍然能够删除自己的卸载程序,不知道是怎么做的。
    我想应该是切断与系统的映像就可以删除自己了,不知道是否如此。大家提点!
      

  4.   

    在windows下好象可以用批处理来实现这个效果,先生成一个后缀为.bat的文件,该文件就是用来删除正在执行的这个文件,生成后执行该批处理文件并退出正在执行的文件,这样就可以达到删除的目的,在批处理文件的最后别忘了加上删除这个批处理文件自己的语句,因为在windows下批处理文件可以是自删除的!
      

  5.   

    批处理是可以,但是好像不是很好看呢,现在还用.bat感觉不是很好吧。
    有没有什么别的方法?
      

  6.   

    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); //新建一个使用后,就由操作系统自动删除的文件
    …………
    下面就自己做吧!