5

我有一个基于对话框的 MFC 应用程序,它需要停止 Windows Wifi 服务才能正确运行,但我想在我的应用程序退出时再次启用它。

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

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

两种方法似乎都有效,但我想知道任何一种方法是否都有缺点。

4

2 回答 2

3

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

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

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

编辑. 如果您想在对话框类中制作清理代码,WM_DESTROY(Roger Rowland 已经提到)比WM_CLOSE. 有时我们可以处理WM_CLOSE消息并防止对话框关闭,例如,通过询问“退出程序?是 - 否”。如果您想使用某些子窗口,它们存在于消息处理程序中WM_CLOSEWM_DESTROY而不存在于对话框析构函数中。此外,调用主对话框析构函数时消息队列不存在,因此在这种情况下不应使用 Windows 消息传递。

于 2013-04-09T14:04:33.667 回答
3

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

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

InitInstanceExitInstance,以及诸如 之类的 Windows 消息WM_CLOSE,发生在应用程序生命周期中的适当位置,以在必要时显示错误消息,或中止以响应错误条件。

于 2013-04-09T14:47:21.633 回答