DLLでのLoadString

DLL内でフツーにCString::LoadString()を使うとexe側のリソースの ストリングテーブルから読み込まれてしまいます。
DLL用のリソースファイルから読み込むテクニック
ハンドル指定してLoadString()を呼べばよし

#define DLL_NAME "Dll.dll"

/* DLLのリソースからLoadString() */

int                     // 読み込みバイト数
CDllApp::LoadString(
    int nID,            // in  リソース番号
    CString& csStr,     // out 文字列格納先
    int len             // in  最大読み込みバイト数
){
    HMODULE thdl = GetModuleHandle(DLL_NAME);
    csStr.Empty();
    char* buff = csStr.GetBuffer(len-1);
    int nLen = ::LoadString(thdl,nID,buff,len);
    csStr.ReleaseBuffer();
    return nLen;
}
(Aug 26,2002)
2003/07/23(水)追記
DLLの関数入り口でAFX_MANAGE_STATEマクロを使うとモジュール状態が切り替わり、 DLLのリソースを使う事が出来るのでした。
上記の様な複雑な事をする必要なかったのね。

MSDNの解説
デフォルトでは、MFC はメイン アプリケーションのリソース ハンドルを使用して、 リソース テンプレートをロードします。
DLL でダイアログ ボックスを起動する場合のように、 DLL でエクスポートされた関数がある場合、 このテンプレートは DLL モジュールに保存されます。
適切なハンドルを使用するには、 モジュール状態を切り替える必要があります。
関数のはじめに以下のコードを追加することによって、 切り替えを実行することができます。

AFX_MANAGE_STATE(AfxGetStaticModuleState( ));

これによって、カレント スコープの終わりまで、 カレント モジュールの状態と AfxGetStaticModuleState から返された状態が入れ替わります。

Previous<<   ∧index   >>Next
Back to home
メールはこちらから