VC++實現文件的自我刪除

 BOOL SelfDel1() 

    SHELLEXECUTEINFO sei; 
    TCHAR szModule [MAX_PATH],szComspec[MAX_PATH],szParams [MAX_PATH]; 
     
    // 獲得文件名.  
    if((GetModuleFileName(0,szModule,MAX_PATH)!=0) && 
        (GetShortPathName(szModule,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; 
         
        // 執行shell命令.  
        if(ShellExecuteEx(&sei)) 
        { 
            // 設置命令行進程的執行級別爲空閒執行,使本程序有足夠的時間從內存中退出.   
            SetPriorityClass(sei.hProcess,IDLE_PRIORITY_CLASS); 
            SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS); 
            SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL); 
             
           // 通知Windows資源瀏覽器,本程序文件已經被刪除.  
            SHChangeNotify(SHCNE_DELETE,SHCNF_PATH,szModule,0); 
            return TRUE; 
        } 
    } 
    return FALSE; 
}  
 
BOOL SelfDel2() 

    CStdioFile  file; 
    CFileException fileEx; 
    TCHAR szDir[MAX_PATH]; 
    TCHAR szModule[MAX_PATH]; 
 
    GetModuleFileName(0, szModule, sizeof(szModule));   // 獲得應用程序名.  
    GetCurrentDirectory(MAX_PATH, szDir);               // 獲得文件的當前目錄.  
 
    CString strFilePath=CString(szDir)+"tempDel.bat";   // 臨時批處理文件名.  
 
    if(!file.Open(strFilePath,CFile::modeWrite |  
        CFile::typeText | CFile::modeCreate,&fileEx)) 
    { 
        #ifdef _DEBUG  
        afxDump << "The file could not be opened " << strFilePath<<"\n"; 
        afxDump << "Cause :"<<fileEx.m_cause << "\n"; 
        #endif  
        return FALSE; 
    } 
     
    CString strCmdLine1,strCmdLine2; 
    strCmdLine1.Format("del %s\n",szModule); 
    strCmdLine2.Format("del %%0\n"); 
 
    file.WriteString(strCmdLine1);                    // 寫刪除EXE的命令行.  
    file.WriteString(strCmdLine2);                    // 寫刪除BAT的命令行.  
    file.Close(); 
     
    WinExec(strFilePath,SW_HIDE);                     // 執行自行刪除操作.  
 
    return TRUE; 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章