GetModuleHandleEx用法示例。 WTL国际化

时间:2013-08-21 19:23:22

标签: winapi mfc atl wtl

我正在尝试在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

1 个答案:

答案 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;

这可以让您动态切换资源库而无需额外的开销。