У меня есть приложение на основе MFC, которое использует интерфейс ленты Office 2007. MFC статически связан.
Я пытаюсь добавить японскую локализацию. У меня есть локализованные ресурсы в отдельной 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
включены в файлы rc как DLL, так и EXE.
Я также нашел Подобный вопрос задан на tech-archive.net и возможное решение там обозначено
Теперь я нахожу место ошибки. это shoule будет ошибкой нового MFC
версия.В CMFCVisualManagerOffice2007, когда стиль меняется,
Функция SetStyle CMFCVisualManagerOffice2007 автоматический вызов FreeLibrary
освободить dll, поэтому ошибка произошла.Теперь я извлек класс из CMFCVisualManagerOffice2007 и добавил
статическая функция для установки переменной-члена m_bAutoFreeRes, выполнив
это приложение может работать правильно; смотрите ниже.Класс CMFCVisualExtManagerOffice2007: public
CMFCVisualManagerOffice2007 {
DECLARE_DYNCREATE (CMFCVisualExtManagerOffice2007) public:
CMFCVisualExtManagerOffice2007 (); виртуальный
~ CMFCVisualExtManagerOffice2007 ();статическая пустота SetAutoFreeRes (BOOL bAutoFree = FALSE) {m_bAutoFreeRes =
bAutoFree; }};
Но у меня проблемы с пониманием того, что именно вызывает проблему, и как это решение работает. Также я не уверен, что это правильное решение. Кто-нибудь знает, что именно вызывает эту проблему, и как работает решение?
Я понял, как работает решение. Мне нужно установить 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;
}
Других решений пока нет …