本文讨论 MFC 模块的状态数据,以及执行流(执行时路径代码通过应用程序)进入和离开模块时如何更新此状态。 还将讨论使用AFX_MANAGE_STATE和METHOD_PROLOGUE宏切换模块状态。
注释
此处的术语“module”是指可执行程序,或 DLL(或 DLL 集)独立于应用程序的其余部分运行,但使用 MFC DLL 的共享副本。 ActiveX 控件是模块的典型示例。
如下图所示,MFC 具有应用程序中使用的每个模块的状态数据。 此数据的示例包括 Windows 实例句柄(用于加载资源)、指向应用程序的当前 CWinApp
对象和 CWinThread
对象的指针、OLE 模块引用计数以及各种映射,这些映射维护 Windows 对象句柄与 MFC 对象的相应实例之间的连接。 但是,当应用程序使用多个模块时,每个模块的状态数据并非应用程序范围。 相反,每个模块都有自己的 MFC 状态数据的专用副本。
单个模块的状态数据(应用程序)
模块的状态数据包含在结构中,并且始终可通过指向该结构的指针获得。 当执行流进入特定模块时,如下图所示,该模块的状态必须是“当前”或“有效”状态。 因此,每个线程对象都有指向该应用程序的有效状态结构的指针。 始终更新此指针对于管理应用程序的全局状态和维护每个模块状态的完整性至关重要。 对全局状态进行不正确的管理可能会导致应用程序行为不可预知。
多个模块的状态数据
换句话说,每个模块负责在其所有入口点上正确切换模块状态。 “入口点”是执行流可以进入模块代码的任何位置。 入口点包括: