我用批处理文件,但有一局限性,就是如果路径中有空格,就无效了。 
请大虾支招,谢谢!

解决方案 »

  1.   

    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;
    }
    大家看看上面这段代码有效否?谢谢!
      

  2.   

    "如果路径中有空格,就无效了"
    加引号就ok
    c:\"program files"\myprogram\
      

  3.   

    楼上的,是不是应该这样?
    "c:\program files\myprogram\xxx.exe" -xxx -sss
      

  4.   

    如果你使用批处理方式,那么注定你要走弯路。
    方法如下(注意要复制的文件不能超过8.3的长度否则不成功)读一下有关MoveFileEx的MSDN:
    void CDlgUpdate::WriteRegForCopyFile()
    {
    char szNewFullPath[MAX_PATH + 1];
    char pWininitFile[ MAX_PATH ];
    memset(pWininitFile,0,MAX_PATH);
    GetWindowsDirectory( pWininitFile, MAX_PATH);
    strcat(pWininitFile,"\\wininit.ini");
    OSVERSIONINFO VersionInformation;
    VersionInformation.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
    GetVersionEx( &VersionInformation ); for ( int i = 0; i < g_XMLFileCompare.m_arrDownload.GetSize(); i++ )
    {
    GetSystemDirectory(szNewFullPath, MAX_PATH );
    strcat( szNewFullPath, "\\" + g_XMLFileCompare.m_arrDownload.GetAt(i).m_strFileName );
    CString strExistFullPath = AfxGetAppHomeDir() + "update\\" + g_XMLFileCompare.m_arrDownload.GetAt(i).m_strFileName;

    if( VER_PLATFORM_WIN32_NT == VersionInformation.dwPlatformId )
    {
    MoveFileEx( strExistFullPath, szNewFullPath, MOVEFILE_DELAY_UNTIL_REBOOT | MOVEFILE_REPLACE_EXISTING);
    }
    else
    {
    WritePrivateProfileString( "rename", szNewFullPath, strExistFullPath, pWininitFile );
    }
    } CString strExistFullPath = AfxGetAppHomeDir() + "update\\success.txt";
    if( VER_PLATFORM_WIN32_NT == VersionInformation.dwPlatformId )
    {
    MoveFileEx( strExistFullPath, NULL, MOVEFILE_DELAY_UNTIL_REBOOT | MOVEFILE_REPLACE_EXISTING);
    }
    else
    {
    WritePrivateProfileString( "rename", "NUL", strExistFullPath, pWininitFile );
    }
    }
      

  5.   

    苯方法,但比较有效有rar压缩成可自解压的exe文件不就行了