GetModuleHandleEx使用示例。 WTL国际(GetModuleHandleEx u

2019-09-29 05:35发布

我试图做国际化的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;

现在,我真的不知道如何使用这个功能,虽然它是在这里 ,我不知道是什么lpModuleName代表。 该“GuiLibOther.dll”是包含在另一种语言的整个界面一个dll ..翻译成另一种语言的所有资源。我想选择另一种语言后,界面imediatelly更改语言。 这是正确的方式? 案例0返回HMOD = NULL

Answer 1:

首先你不想使用GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS ,除非你通过一些项目的地址在DLL,在这种情况下你不标志。

第二文档意味着DLL必须已经在打电话前装GetModuleHandleEx 。 如果你还没有在链接到您的.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;

这应该让你动态切换资源库,而无需额外的开销。



文章来源: GetModuleHandleEx usage example. WTL internationalisation
标签: winapi mfc atl wtl