DllInstanceSwitcher 类用于切换 MFC 扩展 DLL 资源






4.59/5 (9投票s)
2002年7月19日

110960
AFX_MANAGE_STATE(AfxGetStaticModuleState())
会导致错误。这是解决该问题的方法。
引言
我曾经编写过一个 MFC 扩展 DLL。该 DLL 包含一个基于 CMDIFrameWnd
的类,并在其上放置了一个 CToolbar
。在将此 DLL 动态加载到主应用程序中后,我发现工具栏的工具提示字符串是从主应用程序的资源中加载的,因为它们具有与 DLL 字符串 ID 相同的字符串 ID。
宏 AFX_MANAGE_STATE(AfxGetStaticModuleState())
不起作用,因为微软不希望我们使用它。
解决方案是编写自己的资源切换类,并在需要使用扩展 DLL 资源的所有地方创建它。以下是该类的代码
extern "C" AFX_EXTENSION_MODULE ExtensionDLL; class DllInstanceSwitcher { public: DllInstanceSwitcher() { m_hInst = AfxGetResourceHandle(); AfxSetResourceHandle(ExtensionDLL.hResource); } ~DllInstanceSwitcher() { AfxSetResourceHandle(m_hInst); } private: HINSTANCE m_hInst; }; #define SWITCH_RESOURCE DllInstanceSwitcher __SwitchInstance;
我们还需要替换声明
static AFX_EXTENSION_MODULE someDLL = { NULL, NULL }
用
extern "C" AFX_EXTENSION_MODULE ExtensionDLL = { NULL, NULL }
我们所需要做的就是在任何想要使用 DLL 资源的地方插入 SWITCH_RESOURCE;
。