我正在尝试在WTL GUI应用程序中进行国际化..在我的下拉选择更改处理程序(用于语言选择,我做这样的事情):
int selected = (int)::SendMessage(m_cbLang, CB_GETCURSEL,0,0);
HMODULE hmod;
int retCode = 0;
switch(selected)
{
case 0:
retCode =::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_PIN, NULL, &hmod);
ATL::_AtlBaseModule.SetResourceInstance(hmod);
break;
case 1:
retCode =::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_PIN, L"GuiLibOther.dll", &hmod);
ATL::_AtlBaseModule.SetResourceInstance(hmod);
break;
}
return S_OK;
现在,我真的不知道如何使用这个函数,虽然它是here,我不知道 lpModuleName 代表什么。 “GuiLibOther.dll”是一个dll,它包含另一种语言的整个界面..所有资源都翻译成另一种语言..我希望界面在选择另一种语言后立即更改语言。这是正确的方法吗? 案例0返回hmod = NULL
答案 0 :(得分:1)
首先你不想使用GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
标志,除非你传递DLL中某些项目的地址,在这种情况下你不是。
其次,文档暗示在调用GetModuleHandleEx
之前必须已加载DLL。如果您尚未将其链接到.exe以便自动加载,则必须使用LoadLibrary
。
使用LoadLibrary
的需要表明了简化:
static HMODULE hmodExe = INVALID_HANDLE;
static HMODULE hmodDLL1 = INVALID_HANDLE;
switch(selected)
{
case 0:
if (hmodExe == INVALID_HANDLE)
retCode =::GetModuleHandleEx(0, NULL, &hmodExe);
ATL::_AtlBaseModule.SetResourceInstance(hmodExe);
break;
case 1:
if (hmodDLL1 == INVALID_HANDLE)
hmodDLL1 = LoadLibrary(L"GuiLibOther.dll");
ATL::_AtlBaseModule.SetResourceInstance(hmodDLL1);
break;
这可以让您动态切换资源库而无需额外的开销。