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