1

私は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 です。すべてのリソースが別の言語に翻訳されています。別の言語を選択した直後に、インターフェイスで言語を変更する必要があります。これは正しい方法ですか?ケース 0 リターン hmod = NULL

4

1 に答える 1

1

まず第一にGET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS、DLL 内の項目のアドレスを渡す場合を除き、このフラグを使用したくありません。この場合はそうではありません。

2 番目のドキュメントでは、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;

これにより、追加のオーバーヘッドなしでリソース ライブラリを動的に切り替えることができます。

于 2013-08-21T22:22:53.803 に答える