65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.59/5 (9投票s)

2002年7月19日

viewsIcon

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;

© . All rights reserved.