1、在DLG类中添加成员函数,BOOL DeleteSelft(),代码如下:
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; }
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(); }