+ fix: minor problems on load/release MUI language libs

This commit is contained in:
Rainer Kottenhoff 2019-03-04 10:51:29 +01:00
parent e66096feca
commit 06f6981e20
4 changed files with 32 additions and 30 deletions

View File

@ -188,7 +188,7 @@ static bool _GetUserPreferredLanguage(LPWSTR pszPrefLocaleName, int cchBuffer, L
// LoadLanguageResources
//
//
HMODULE LoadLanguageResources(LANGID* pPrefLanguageID)
LANGID LoadLanguageResources()
{
// 1st check language resources
Globals.iAvailLngCount = _CheckAvailableLanguageDLLs();
@ -241,23 +241,27 @@ HMODULE LoadLanguageResources(LANGID* pPrefLanguageID)
// obtains access to the proper resource container
// for standard Win32 resource loading this is normally a PE module - use LoadLibraryEx
HMODULE hLangResourceContainer = NULL;
HINSTANCE _hLangResourceContainer = NULL;
Globals.bPrefLngNotAvail = (iPrefLngIndex < 0);
if ((iPrefLngIndex >= 0) && MUI_LanguageDLLs[iPrefLngIndex].bHasDLL) {
hLangResourceContainer = (0 == iPrefLngIndex) ? Globals.hInstance :
_hLangResourceContainer = (iPrefLngIndex == 0) ? Globals.hInstance :
LoadMUILibrary(L"lng/np3lng.dll", MUI_LANGUAGE_NAME | MUI_LANGUAGE_EXACT, languageID);
MUI_LanguageDLLs[iPrefLngIndex].bIsLoaded = true;
if (_hLangResourceContainer) {
MUI_LanguageDLLs[0].bIsActive = false;
MUI_LanguageDLLs[iPrefLngIndex].bIsActive = true;
}
}
if (!hLangResourceContainer) {
if (!_hLangResourceContainer) {
// fallback to ENGLISH_US
//GetLastErrorToMsgBox(L"LoadMUILibrary", 0);
Globals.bPrefLngNotAvail = (languageID != MUI_LanguageDLLs[0].LangId);
languageID = MUI_LanguageDLLs[0].LangId;
hLangResourceContainer = Globals.hInstance;
MUI_LanguageDLLs[0].bIsLoaded = true;
_hLangResourceContainer = Globals.hInstance;
MUI_LanguageDLLs[0].bIsActive = true;
}
Globals.hLngResContainer = _hLangResourceContainer;
SetThreadUILanguage(languageID);
// update language dependent items
@ -266,8 +270,7 @@ HMODULE LoadLanguageResources(LANGID* pPrefLanguageID)
Encoding_SetLabel(enc);
}
*pPrefLanguageID = languageID;
return hLangResourceContainer;
return languageID;
}
@ -276,15 +279,16 @@ HMODULE LoadLanguageResources(LANGID* pPrefLanguageID)
// FreeLanguageResources
//
//
void FreeLanguageResources(HMODULE hLangResourceContainer)
void FreeLanguageResources()
{
if (hLangResourceContainer) {
if (hLangResourceContainer != Globals.hInstance) {
FreeMUILibrary(hLangResourceContainer);
}
if (Globals.hLngResContainer != Globals.hInstance) {
HINSTANCE const _hLngResContainer = Globals.hLngResContainer;
Globals.hLngResContainer = Globals.hInstance;
MUI_LanguageDLLs[0].bIsActive = true;
FreeMUILibrary(_hLngResContainer);
}
for (int i = 0; i < MuiLanguages_CountOf(); ++i) {
MUI_LanguageDLLs[i].bIsLoaded = false;
for (int i = 1; i < MuiLanguages_CountOf(); ++i) {
MUI_LanguageDLLs[i].bIsActive = false;
}
}

View File

@ -24,7 +24,7 @@ typedef struct _muilanguage
// !!! WARNING: LCID is DEPRECATED
LANGID LangId; // just for historic reasons
bool bHasDLL;
bool bIsLoaded;
bool bIsActive;
} MUILANGUAGE, *PMUILANGUAGE;
@ -32,8 +32,8 @@ extern MUILANGUAGE MUI_LanguageDLLs[];
int MuiLanguages_CountOf();
HMODULE LoadLanguageResources(LANGID* pPrefLanguageID);
void FreeLanguageResources(HMODULE hLangResourceContainer);
LANGID LoadLanguageResources();
void FreeLanguageResources();
int LoadLngStringW(UINT uID, LPWSTR lpBuffer, int nBufferMax);
int LoadLngStringA(UINT uID, LPSTR lpBuffer, int nBufferMax);

View File

@ -533,8 +533,7 @@ static void _CleanUpResources(const HWND hwnd, bool bIsInitialized)
DestroyMenu(Globals.hMainMenu);
}
FreeLanguageResources(Globals.hLngResContainer);
Globals.hLngResContainer = NULL;
FreeLanguageResources();
if (s_hRichEdit) {
FreeLibrary(s_hRichEdit);
@ -638,8 +637,8 @@ int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,
// ----------------------------------------------------
// MultiLingual
//
Globals.iPrefLANGID = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
Globals.hLngResContainer = LoadLanguageResources(&Globals.iPrefLANGID);
//Globals.iPrefLANGID = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
Globals.iPrefLANGID = LoadLanguageResources();
// ----------------------------------------------------
@ -2910,7 +2909,7 @@ LRESULT MsgInitMenu(HWND hwnd, WPARAM wParam, LPARAM lParam)
for (int lng = 0; lng < MuiLanguages_CountOf(); ++lng) {
//EnableCmd(hmenu, MUI_LanguageDLLs[lng].rid, MUI_LanguageDLLs[lng].bHasDLL);
CheckCmd(hmenu, MUI_LanguageDLLs[lng].rid, MUI_LanguageDLLs[lng].bIsLoaded);
CheckCmd(hmenu, MUI_LanguageDLLs[lng].rid, MUI_LanguageDLLs[lng].bIsActive);
}
return FALSE;
@ -2929,7 +2928,7 @@ static bool _DynamicLanguageMenuCmd(int cmd)
if ((iLngIdx < 0) || (iLngIdx >= MuiLanguages_CountOf())) {
return false;
}
if (!MUI_LanguageDLLs[iLngIdx].bIsLoaded)
if (!MUI_LanguageDLLs[iLngIdx].bIsActive)
{
if (IsWindow(Globals.hwndDlgFindReplace)) {
SendMessage(Globals.hwndDlgFindReplace, WM_CLOSE, 0, 0);
@ -2942,10 +2941,9 @@ static bool _DynamicLanguageMenuCmd(int cmd)
IniSetString(L"Settings2", L"PreferredLanguageLocaleName", Settings2.PreferredLanguageLocaleName);
DestroyMenu(Globals.hMainMenu);
FreeLanguageResources(Globals.hLngResContainer);
Globals.iPrefLANGID = MUI_LanguageDLLs[iLngIdx].LangId;
Globals.hLngResContainer = LoadLanguageResources(&Globals.iPrefLANGID);
FreeLanguageResources();
Globals.iPrefLANGID = LoadLanguageResources();
Globals.hMainMenu = LoadMenu(Globals.hLngResContainer, MAKEINTRESOURCE(IDR_MUI_MAINMENU));
if (!Globals.hMainMenu) {
GetLastErrorToMsgBox(L"LoadMenu()", 0);

View File

@ -266,7 +266,7 @@ typedef struct _globals_t
{
HINSTANCE hInstance;
HINSTANCE hPrevInst;
HMODULE hLngResContainer;
HINSTANCE hLngResContainer;
int iAvailLngCount;
bool bPrefLngNotAvail;
HWND hwndMain;