C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 流用元のDLLのリソースが呼び出されてしまう(MFC)


(過去ログ 89 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■53235 / inTopicNo.1)  流用元のDLLのリソースが呼び出されてしまう(MFC)
  
□投稿者/ DD. (33回)-(2010/09/07(Tue) 23:25:11)

分類:[C/C++] 

お世話になります。DD.です。

VC++2008Pro & XP でのMFC開発環境になります。

現在、既にMFCで作成されているDLLを"プロジェクト毎そのままコピーして"作られた(プロジェクト名は同じ)、内部仕様の少々異なるDLLを使用しています。
この流用元と流用先の両方のDLLを同一プロセス上で使用しているのですが、流用先DLLのリソースで定義されているString Tableの内容をCString::LoadString()で使用しようとすると、同じIDで定義されている流用元DLLのString Tableの文字列が引っ張られてくる現象が起きています。

LoadString()内でプロセスにロードされているDLLのメモリ位置の検索時に流用先DLLではなく、流用元DLLのほうが先に引っかかってしまっている?ような感じなのですが、DLLを識別するための一意なIDなどがMFCでDLLプロジェクト作成の際に自動で割り振られていたりするのでしょうか?
もしそうなのであれば、それはどこで定義されているのでしょうか? また、変更可能なのでしょうか?

どなたかご教授頂ければと思います。

引用返信 編集キー/
■53241 / inTopicNo.2)  Re[1]: 流用元のDLLのリソースが呼び出されてしまう(MFC)
□投稿者/ shu (15回)-(2010/09/08(Wed) 08:47:42)
No53235 (DD. さん) に返信

http://www.ikuyama.net/ryo/mfc/mfc02.html

これどう?
引用返信 編集キー/
■53255 / inTopicNo.3)  Re[1]: 流用元のDLLのリソースが呼び出されてしまう(MFC)
□投稿者/ とっちゃん (541回)-(2010/09/08(Wed) 11:22:23)
とっちゃん さんの Web サイト
No53235 (DD. さん) に返信
> この流用元と流用先の両方のDLLを同一プロセス上で使用しているのですが、流用先DLLのリソースで定義されているString Tableの内容をCString::LoadString()で使用しようとすると、同じIDで定義されている流用元DLLのString Tableの文字列が引っ張られてくる現象が起きています。
>
たぶん解決できるであろう策は後述していますがそれと合わせて
テクニカルノート
http://msdn.microsoft.com/ja-jp/library/h6h0eact.aspx
も熟読することをお勧めします。下記の解決策はここに書かれている知識を知っていることを
前提としている部分が多々ありますので。




・MFC拡張DLLの場合
よりどころとするCWinApp(利用元のEXEまたは、レギュラーDLL(OCXなどを含む)が持つ)に所属する
すべてのDLLでリソース識別子を重複させないように調整する必要があります。
原則事項ではありますがこれを行っておくことにより、意図しないリソースのロードが発生したり
ということがなくなります。

もし、この原則から外れなければならない(IDの枯渇などが原因で重複が避けられない
他社製のモジュールに割り込むため調整ができない)場合は
LoadString API や、LoadBitmap APIなどを呼び出すMFCのメソッドの呼び出し前に
AfxSetResourceHandle() を呼び出して、ロード対象とするモジュールを特定させます。
これにより、重複していても意図的に特定のリソースをロードすることができるようになります。

・レギュラーDLLの場合
レギュラーDLLの場合は(MFCをDLLでリンクしているかどうかは無関係です)DLLのエクスポート関数の先頭に
AFX_MANAGE_STATE( AfxGetStaticModuleSate() );
を入れてください。
これにより、MFCの境界が変わり、リソースのロード先などもすべて入れ替わります。

引用返信 編集キー/
■53265 / inTopicNo.4)  Re[2]: 流用元のDLLのリソースが呼び出されてしまう(MFC)
□投稿者/ DD. (36回)-(2010/09/08(Wed) 21:45:33)
shuさん、とっちゃんさん、回答ありがとう御座います。

AFX_MANAGE_STATE()マクロで切り替える必要があったのですね。知りませんでした。。。
ていうかそもそもハンドル渡せるLoadStringのオーバーロードがあったとは・・・調べ足りてませんでした。

無事解決とさせて頂きます。

ありがとう御座いました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -