3

以前にこの質問を投稿し、ローカライズされた文字列(LoadString()で取得した文字列)をロードしましたが、サテライトDLLから他のすべてのリソースもロードする必要があります。

MFCにはAfxSetResourceHandle()呼び出しがありますが、mfc以外のアプリと同等のものが必要ですか?すべてのリソースが別のDLLからロードされるように、初期化コードのどこかにそれを設定する必要があると思います。WTL(Windowsテンプレートライブラリ)コンテキストでこれを行うにはどうすればよいですか?

編集:

これは私たちの問題を要約したものです。

私たちはストレートwin32を使用していませんが、Windows用のATLとWTLを使用しています。そのため、MFCに依存することはできず、メニューやダイアログリソースの読み込みを低レベルで制御することもできません。

編集:うーん... これには答えがあるようですが、私はそれよりも良いものを望んでいました。たとえば、CAppModuleオブジェクトのGetResourceInstance()に類似したSetResourceInstance()メソッド。

4

2 に答える 2

6

リソース関数(FindResource、LoadResource)は、パラメーターの1つとしてモジュールへのハンドルを取ります。

GetModuleHandleExDLLのモジュールハンドルを取得するために使用します。

編集: ATL/WTLの追加情報。

WTLはATL::_AtlBaseModule.GetResourceInstance()、Win32呼び出しでモジュールハンドルを使用します。SetResourceInstance使用するモジュールを変更するために呼び出すことができる関数があります。このようなものは、プログラムの開始時に機能するはずです。

HMODULE hmod;
::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_PIN, myDllFuncPtr, &hmod);
ATL::_AtlBaseModule.SetResourceInstance(hmod);
于 2011-03-17T16:17:19.743 に答える
0

何らかの理由でWindows2000をサポートする必要がある場合など、上記の方法が使用できない場合があります。そのような場合は、次のトリックを手元に置いておくとよいでしょう。

静的変数を宣言します。これは、そのアドレスがリンク先のモジュール内にあることを意味します。次に、その変数のアドレスを使用して、割り当てられた領域のベースアドレスを照会します。これが何であるかHMODULEです。

HMODULE GetCurrentModuleHandle()
{
    MEMORY_BASIC_INFORMATION mbi;
    static int iDummy;
    VirtualQuery(&iDummy, &mbi, sizeof(mbi));
    return (HMODULE)mbi.AllocationBase;
}

これは決してマークの答えを無効にするものではありません!プログラムを古いシステムで実行する必要がある場合は、フォールバックオプションとして覚えておいてください。

于 2014-10-14T09:49:31.930 に答える