リソースIDの重複 – プログラミング – Home

通知
すべてクリア

リソースIDの重複


ねこ
 ねこ
(@ねこ)
ゲスト
結合: 22年前
投稿: 94
Topic starter  

リソースIDが重複したDLLが複数あり、それをEXEから呼び出す為、おかしな動きをしま
す。
それを回避するには

 ・リソースIDを重複しないように管理しながら、AP作成をする
・リソース検索をする都度、AfxSetResourceHandleを呼ぶ。

の方法くらいしか分かりません。

前者は管理が難しく、後者はAfxSetResourceHandleを色んな箇所で呼ばないといけない
ので面倒。
何か他にいい方法はありませんか?


引用解決済
トピックタグ
tenteku
 tenteku
(@tenteku)
ゲスト
結合: 15年前
投稿: 38
 

AFX_MANAGE_STATE(AfxGetStaticModuleState());
ですかね。
詳しくはググればすぐに分かるかと。


返信引用
ねこ
 ねこ
(@ねこ)
ゲスト
結合: 22年前
投稿: 94
Topic starter  

DLLのメイン関数の中に、

AFX_MANAGE_STATE(AfxGetStaticModuleState());

を入れてみたのですが、1つ異常の複数回定義されているシンボルが見つかりました。

って、エラーになって、困ってます(;;)


返信引用
ねこ
 ねこ
(@ねこ)
ゲスト
結合: 22年前
投稿: 94
Topic starter  

AFX_MANAGE_STATE(AfxGetAppModuleState());
をDLLのメイン関数の先頭に入れて、試してみましたが、ダメでした。。。

現象は以下の通りです。

EXE AよりDLL Aを起動、DLL Aより処理を実行し、
DLL B (結果画面)が起動される。

処理を実行中に、EXE Bをアクティブにすると、DLL Bで
DLL Aのリソースが使用される。


返信引用
tenteku
 tenteku
(@tenteku)
ゲスト
結合: 15年前
投稿: 38
 

全コードが分からないので何とも言えませんが
ヘルプを読むとスコープ内で、とあります。
DLLMainでそのリソースを使用していないならおかしなことになっても
不思議はないかと。

int export_function()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());

CDialogHoge dlg;
return dlg.DoModal();
}
MFCならこんな風に使います


返信引用
tenteku
 tenteku
(@tenteku)
ゲスト
結合: 15年前
投稿: 38
 

あと、DLLのタイプを疑うとここに
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200408/04080033.txt
こんな記事がありますので確認してみてください。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

うーーん、
エラーとは関係ないけど
DLL BでDLL Aのリソースを使うのは無理があると思いませんか?
(可能なのかも知れませんが、僕はやったことないです。)
DLL BのリソースはDLL Bで用意したほうがいいですね。
何か無理なことでも?


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

EXE側から、DLL A,Bのリソースを使用したいと言うことですよね?

リソースIDが重複したまま、DLL A, Bのリソースを使用したいのだとすると、
何らかの方法で、DLLのインスタンスを区別する必要があるのは当然だよね。

WindowsAPIだけでプログラミングをする際には、
CreateWindow(), CreateDialog(), LoadStraing(), ...
といったAPIの引数にDLLのインスタンスを渡すのでインスタンスを区別できる
わけです。

その後の、
GetWindowText(), GetDlgItemText(), ...
とかも、上記のAPIで得たウィンドウハンドルを引数にして動作するので、
やはりインスタンスを区別できているわけです。

じゃあ、MFCはどうなのか?
通常のプログラミングでは、いちいちハンドル指定をするのは面倒なので、
ハンドルを隠蔽しちゃってるわけです。

ここまで分かったところで、
例えば、CString::LoadString()の中をデバッガで追ってみてください。
すると、最終的には、
AfxGetResourceHandle()
でハンドルを取得していることが分かるかと思います。

つまり、MFCを使う以上、
AfxGetResourceHandle()
で必要とするリソースハンドルが得られるように仕向けるのは義務だと
思われます。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

もしかして、MFCの拡張DLLかな?

だとしたら、CDynLinkLibraryのインスタンスを順に検索するので、
AfxSetResourceHandle()しなくてもリソース検索は成功します。

ただし、文字通り順に検索するだけなので、
IDが重複すれば先勝ちでヒットするだけです。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

ここに詳しく書かれている。

http://hp.vector.co.jp/authors/VA000092/win32/multi-lang-mfc.html


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました