MFC自删除的实现

1、在DLG类中添加成员函数,BOOL DeleteSelft(),代码如下:

class CDelSelfDlg : public CDialog   
{   
// Construction   
public:   
    CDelSelfDlg(CWnd* pParent = NULL); // standard constructor   
    BOOL DeleteSelf();   
    ......   
} 
class CDelSelfDlg : public CDialog
{
// Construction
public:
CDelSelfDlg(CWnd* pParent = NULL); // standard constructor
BOOL DeleteSelf();
......
}

2、函数实现代码如下:

/************************************************************************/        
/* 函数说明:进程退出时删除自身                                          
/* 参    数:无                                       
/* 返 回 值:成功返回TRUE,失败返回FALSE        
/* By:Koma   2009.08.06 09:50                                    
/************************************************************************/    
BOOL CDelSelfDlg::DeleteSelf()   
{   
    TCHAR szModule [MAX_PATH];   
    TCHAR szComspec[MAX_PATH];   
    TCHAR 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;   
} 
/************************************************************************/     
/* 函数说明:进程退出时删除自身                                        
/* 参    数:无                                     
/* 返 回 值:成功返回TRUE,失败返回FALSE      
/* By:Koma   2009.08.06 09:50                                  
/************************************************************************/ 
BOOL CDelSelfDlg::DeleteSelf()
{
TCHAR szModule [MAX_PATH];
TCHAR szComspec[MAX_PATH];
TCHAR 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;
}

3、在DLG类上右键,添加Windows Message Handler,找到WM_DESTROY,调用成员函数:

/************************************************************************/        
/* 函数说明:窗口销毁消息                                          
/* 参    数:无                                       
/* 返 回 值:无      
/* By:Koma   2009.08.06 09:50                                    
/************************************************************************/    
void CDelSelfDlg::OnDestroy()    
{   
    CDialog::OnDestroy();   
       
    // TODO: Add your message handler code here   
    DeleteSelf();   
}

转载于:https://www.cnblogs.com/rogee/archive/2010/10/14/1851355.html

你可能感兴趣的:(MFC自删除的实现)