关闭MFC对话框时删除自身

本文介绍了一个自删除对话框类CDelSelfDlg的设计方法,通过在对话框类中添加DeleteSelf()成员函数,利用Windows API函数实现进程退出时删除自身文件的功能,并在窗口销毁消息WM_DESTROY的响应函数中调用该成员函数。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值