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

}



你可能感兴趣的:(mfc)