2013-08-21 41 views
1

我試圖做國際化的WTL的GUI應用程序。在我的下拉選項更改處理(這是用於語言選擇我做這樣的事情):GetModuleHandleEx用法示例。 WTL國際

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,其中包含另一種語言的整個接口..所有資源翻譯成另一種語言..我希望界面在選擇另一種語言後更改語言imediatelly。這是正確的方式嗎? case 0 return hmod = NULL

回答

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; 

這應該讓你切換資源庫,動態無額外的開銷。

+0

謝謝,但是如果我希望界面在下降選擇時更改語言,或者這在實際應用中不是非常實用或經常遇到? – AlexandruC

+0

@ A.K我已經添加了一個編輯,看看是否更有意義。 –

+0

它現在非常有意義!謝謝 – AlexandruC