2013-04-09 106 views
5

我有一个基于对话框的MFC应用程序需要停止Windows Wifi服务才能正常运行,但我希望在应用程序退出时再次启用它。MFC应用程序终止时运行自定义代码:d'tor或WM_CLOSE?

所以我想我会把重新启动服务的代码放在主对话框类的析构函数中。

现在我注意到其他人把他们应该在程序终止时运行的代码放入一个WM_CLOSE消息处理程序中。

这两种方式似乎都奏效,但我想知道是否有任何方面的缺点。

+3

嗯,我通常把它放在一个'WM_DESTROY'处理程序中,但我更喜欢这个析构函数,因为我知道MFC基础结构仍然活着,到达Dtor的时候,我不确定:-)通常我保留删除堆分配的dtor。 – 2013-04-09 14:04:22

回答

3

对于基于MFC对话框的应用程序,您可以在主对话框DoModal调用后立即将应用程序类InitInstance方法中的终结代码。对于其他MFC应用程序类型(MDI,SDI),终止代码通常被放置为ExitInstance方法。

基于对话框的应用程序和SDI/MDI应用程序之间的区别是,在InitInstance基于对话框的应用程序返回FALSE,并退出应用程序 - 所有动作在主对话框DoModal调用完成。

对于所有应用程序类型,您可能更喜欢使用ExitInstance,它也应该可以工作。

编辑。如果您想在对话框类中创建清理代码,WM_DESTROY(已由Ro​​ger Rowland提及)比WM_CLOSE更好。有时我们可以处理WM_CLOSE消息并阻止对话框关闭,例如,通过询问“退出程序?是 - 否”。如果您想使用某些子窗口,它们存在于WM_CLOSEWM_DESTROY消息处理程序中,并且不存在于对话框析构函数中。另外,调用主对话框析构函数时,消息队列不存在,所以在这种情况下不应该使用Windows消息传递。

3

旨在保持对称性:如果您在构造函数中停止wifi服务,然后在同一个类的析构函数中重新启动它。如果您在InitInstance停止服务,则需要在ExitInstance;如果作为对WM_CREATE或某些其他消息的响应,然后在WM_CLOSE等中重新启动它。

构造函数和析构函数无法返回错误状态,因此通常它们更适合于简单任务,如初始化和内存分配/释放。

InitInstanceExitInstance,以及窗口消息如WM_CLOSE,发生在应用程序的生命周期,如果需要显示错误消息,或者响应于错误情况中止了良好的光点。

相关问题