导出的 DLL 函数入口点

对于 DLL 的导出函数,使用 AFX_MANAGE_STATE 宏在从 DLL 模块切换到调用应用程序的 DLL 时保持适当的全局状态。

调用时,此宏会将 pModuleState 设置为一个指向含有模块全局数据的结构体的指针 AFX_MODULE_STATE ,从而在该函数的剩余作用域内设定有效的模块状态。 离开包含宏的范围后,将自动还原以前的有效模块状态。

此切换是通过在堆栈上构造类的 AFX_MODULE_STATE 实例来实现的。 在构造函数中,该类获取一个指向当前模块状态的指针,并将其存储在一个成员变量中,然后将 pModuleState 设置为新的有效模块状态。 在析构函数中,此类将还原存储在其成员变量中的指针作为有效的模块状态。

如果有导出的函数(例如在 DLL 中启动对话框的函数),则需要将以下代码添加到函数的开头:

AFX_MANAGE_STATE(AfxGetStaticModuleState())

这会将当前模块状态与通过 AfxGetStaticModuleState 返回的状态交换,直到当前作用域的末尾。

如果未使用 AFX_MANAGE_STATE 宏,DLL 中的资源将会出现问题。 默认情况下,MFC 使用主应用程序的资源句柄来加载资源模板。 此模板实际上存储在 DLL 中。 根本原因是 MFC 的模块状态信息尚未通过 AFX_MANAGE_STATE 宏进行切换。 资源句柄将从 MFC 的模块状态中恢复。 不切换模块状态将导致使用错误的资源句柄。

AFX_MANAGE_STATE 不需要放入 DLL 中的每个函数中。 例如,应用程序中的 MFC 代码可以调用 InitInstance 而不需要 AFX_MANAGE_STATE,因为 MFC 会在 InitInstance 前自动移动模块状态,并在 InitInstance 返回后切换回来。 所有消息映射处理程序也是如此。 常规 MFC DLL 实际上具有特殊的主窗口过程,用于在路由任何消息之前自动切换模块状态。

另请参阅

管理 MFC 模块的状态数据