リソースIDが重複したDLLが複数あり、それをEXEから呼び出す為、おかしな動きをしま
す。
それを回避するには
・リソースIDを重複しないように管理しながら、AP作成をする
・リソース検索をする都度、AfxSetResourceHandleを呼ぶ。
の方法くらいしか分かりません。
前者は管理が難しく、後者はAfxSetResourceHandleを色んな箇所で呼ばないといけない
ので面倒。
何か他にいい方法はありませんか?
AFX_MANAGE_STATE(AfxGetStaticModuleState());
ですかね。
詳しくはググればすぐに分かるかと。
DLLのメイン関数の中に、
AFX_MANAGE_STATE(AfxGetStaticModuleState());
を入れてみたのですが、1つ異常の複数回定義されているシンボルが見つかりました。
って、エラーになって、困ってます(;;)
AFX_MANAGE_STATE(AfxGetAppModuleState());
をDLLのメイン関数の先頭に入れて、試してみましたが、ダメでした。。。
現象は以下の通りです。
EXE AよりDLL Aを起動、DLL Aより処理を実行し、
DLL B (結果画面)が起動される。
処理を実行中に、EXE Bをアクティブにすると、DLL Bで
DLL Aのリソースが使用される。
全コードが分からないので何とも言えませんが
ヘルプを読むとスコープ内で、とあります。
DLLMainでそのリソースを使用していないならおかしなことになっても
不思議はないかと。
int export_function()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CDialogHoge dlg;
return dlg.DoModal();
}
MFCならこんな風に使います
あと、DLLのタイプを疑うとここに
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200408/04080033.txt
こんな記事がありますので確認してみてください。
うーーん、
エラーとは関係ないけど
DLL BでDLL Aのリソースを使うのは無理があると思いませんか?
(可能なのかも知れませんが、僕はやったことないです。)
DLL BのリソースはDLL Bで用意したほうがいいですね。
何か無理なことでも?
EXE側から、DLL A,Bのリソースを使用したいと言うことですよね?
リソースIDが重複したまま、DLL A, Bのリソースを使用したいのだとすると、
何らかの方法で、DLLのインスタンスを区別する必要があるのは当然だよね。
WindowsAPIだけでプログラミングをする際には、
CreateWindow(), CreateDialog(), LoadStraing(), ...
といったAPIの引数にDLLのインスタンスを渡すのでインスタンスを区別できる
わけです。
その後の、
GetWindowText(), GetDlgItemText(), ...
とかも、上記のAPIで得たウィンドウハンドルを引数にして動作するので、
やはりインスタンスを区別できているわけです。
じゃあ、MFCはどうなのか?
通常のプログラミングでは、いちいちハンドル指定をするのは面倒なので、
ハンドルを隠蔽しちゃってるわけです。
ここまで分かったところで、
例えば、CString::LoadString()の中をデバッガで追ってみてください。
すると、最終的には、
AfxGetResourceHandle()
でハンドルを取得していることが分かるかと思います。
つまり、MFCを使う以上、
AfxGetResourceHandle()
で必要とするリソースハンドルが得られるように仕向けるのは義務だと
思われます。
もしかして、MFCの拡張DLLかな?
だとしたら、CDynLinkLibraryのインスタンスを順に検索するので、
AfxSetResourceHandle()しなくてもリソース検索は成功します。
ただし、文字通り順に検索するだけなので、
IDが重複すれば先勝ちでヒットするだけです。