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 : public CMFCVisualManagerOffice2007 { DECLARE_DYNCREATE(CMFCVisualExtManagerOffice2007) public: CMFCVisualExtManagerOffice2007(); 仮想 ~CMFCVisualExtManagerOffice2007();

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


しかし、問題の正確な原因と、この解決策がどのように機能するかを理解するのに苦労しています。また、それが正しい解決策であるかどうかもわかりません。この問題の正確な原因と解決策を知っている人はいますか?

4

1 に答える 1

0

ソリューションがどのように機能するかを理解しました。m_bAutoFreeResを呼び出すたびに falseに設定する必要があり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 に答える