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
メールはこちらから