0

我有一个使用 Office 2007 功能区界面的基于 MFC 的应用程序。MFC 是静态链接的。

我正在尝试添加日语本地化。我在单独的 DLL 中有本地化资源。我在开头加载资源 DLL InitInstance

VERIFY(hRes = LoadLibrary(_T("JapaneseLang.dll")));
if(hRes)
    AfxSetResourceHandle(hRes);

这会导致断言失败CMFCVisualManagerOffice2007::OnUpdateSystemColors

#if !defined _AFXDLL
        TRACE(_T("\r\nImportant: to enable the Office 2007 look in static link,\r\n"));
        TRACE(_T("include afxribbon.rc from the RC file in your project.\r\n\r\n"));
        ASSERT(FALSE);
#endif

但我确实afxribbon.rc包含在 DLL 和 EXE 的 rc 文件中。


我还在tech-archive.net 上发现了一个类似的问题,并在那里概述了一个可能的解决方案

现在我找到了错误位置。这应该是新 mfc 版本的错误。

在CMFCVisualManagerOffice2007中,当样式发生变化时,CMFCVisualManagerOffice2007的SetStyle函数会自动调用FreeLibrary释放dll,所以出现错误。

现在我从 CMFCVisualManagerOffice2007 派生了一个类,并添加了一个静态函数来设置成员变量 m_bAutoFreeRes ,这样应用程序可以正常运行;见下文。

类 CMFCVisualExtManagerOffice2007:公共 CMFCVisualManagerOffice2007 { DECLARE_DYNCREATE(CMFCVisualExtManagerOffice2007)公共:CMFCVisualExtManagerOffice2007();虚拟~CMFCVisualExtManagerOffice2007();

静态无效 SetAutoFreeRes(BOOL bAutoFree = FALSE) { m_bAutoFreeRes = bAutoFree; } };


但我很难理解究竟是什么导致了问题,以及这个解决方案是如何工作的。另外我不确定这是否是正确的解决方案。有谁知道究竟是什么导致了这个问题,以及解决方案是如何工作的?

4

1 回答 1

0

我弄清楚了解决方案是如何工作的。每次m_bAutoFreeRes调用CMFCVisualManagerOffice2007::SetStyle.

class CMFCVisualExtManagerOffice2007 : public CMFCVisualManagerOffice2007
{
    DECLARE_DYNCREATE(CMFCVisualExtManagerOffice2007)
public:
    CMFCVisualExtManagerOffice2007();
    virtual ~CMFCVisualExtManagerOffice2007();

    static void SetAutoFreeRes(BOOL bAutoFree = FALSE)
    {
        m_bAutoFreeRes = bAutoFree;
    }
};

然后在主题之间切换时

    switch (m_nAppLook)
    {
    case ID_VIEW_APPLOOK_OFF_2007_BLUE:
        CMFCVisualManagerOffice2007::SetStyle (CMFCVisualManagerOffice2007::Office2007_LunaBlue);
        CMFCVisualExtManagerOffice2007::SetAutoFreeRes(FALSE);
        break;

    case ID_VIEW_APPLOOK_OFF_2007_BLACK:
        CMFCVisualManagerOffice2007::SetStyle (CMFCVisualManagerOffice2007::Office2007_ObsidianBlack);
        CMFCVisualExtManagerOffice2007::SetAutoFreeRes(FALSE);
        break;

    case ID_VIEW_APPLOOK_OFF_2007_SILVER:
        CMFCVisualManagerOffice2007::SetStyle (CMFCVisualManagerOffice2007::Office2007_Silver);
        CMFCVisualExtManagerOffice2007::SetAutoFreeRes(FALSE);
        break;

    case ID_VIEW_APPLOOK_OFF_2007_AQUA:
        CMFCVisualManagerOffice2007::SetStyle (CMFCVisualManagerOffice2007::Office2007_Aqua);
        CMFCVisualExtManagerOffice2007::SetAutoFreeRes(FALSE);
        break;
    }
于 2012-10-17T12:01:22.387 回答