DOBON.NET DOBON.NETプログラミング掲示板過去ログ

同じDLLを1つのプロセスで複数読み込みたい。

環境/言語:[Windows7 C#]
分類:[.NET]

こんにちわ。

とあるDLLの作りが、グローバル変数を使っているようで、
クラスを複数 new するとDLL内部で競合が起こり、使えません。
同じDLLをnew する数だけ読み込むことが出来れば…と思い質問させて頂きました。

宜しくお願いします。
■No32374に返信(納豆さんの記事)
> とあるDLLの作りが、グローバル変数を使っているようで、
> クラスを複数 new するとDLL内部で競合が起こり、使えません。

グローバル変数というのは、static フィールドのことでしょうか。
それとも、GlobalAddAtom など?
それとも、OS のクリップボードやレジストリエントリなどのように、
単一のリソースを読み書きする仕組みが使われているのでしょうか?


> 同じDLLをnew する数だけ読み込むことが出来れば…と思い質問させて頂きました。
DLL 側を修正するわけにはいかないのでしょうか。

仮に static フィールドに要因があるとすれば、
クラスを new しても意味が無いと思いますし。

DLL 側の作りが読めないので、解決するかどうかは分かりませんが
動的ロードという話なら、AppDomain を使う選択肢はありますね。
http://msdn.microsoft.com/ja-jp/library/dd296853.aspx
魔界の仮面弁士さん

返信ありがとうございます。
他人の作ったDLL をなんとかして使いまわそうと考えていまして、
DLL内で

CExp g_ins;

という感じで実体が作られています。
このグローバル宣言されたクラスを直接使用するわけではないのですが、
それを使うクラスをこちら側のコードからnew しています。
まあ、なんとか修正なしで使えないかなぁと考えているのですが、
当然ながら、g_ins は1つしかないので、2つnew しても競合して正常に
動かない…という感じです。
連投すいません。

ちなみに、対象のDLL はMFCで記述されています。
2014/06/05(Thu) 07:23:06 編集(投稿者)

■No32380に返信(納豆さんの記事)
> ちなみに、対象のDLL はMFCで記述されています。

DLL ファイルをコピーして別名にするぐらいしかないかもしれません。
(この方法で動くかは未検証)

基本的には、同じものを何回も読み込んでも、同じ存在を利用するはずとして Windows が設計・実装されているので、同じメモリ空間にマップされます。
従って、DLL 内でグローバル変数が定義されているのであれば共有される運命を避けられません。
そうなると、別物の DLL と認識させるために、DLL ファイル名を変えていくしか手立てはありませんが、そうすると DLL の数が増えていきますし、動的に量を変えることもできず、パフォーマンスも悪化し、使い勝手が著しく悪くなります。

現実的には「あきらめる」ことを考えた方がよいかもしれません。
「使い回すのをあきらめる」、「複数のオブジェクトから同時に利用することをあきらめる(何らかの同期オブジェクトを使って同時に DLL を使わないように排他する)」。
■No32380に返信(納豆さんの記事)
> ちなみに、対象のDLL はMFCで記述されています。

  C++ や、MFC で書かれたDLL なら、#pragma で、データグメント
  を共有宣言設定することが可能で、そこに定義された変数は、
  どのEXE から呼び出されても、共有な為、別扱いにできません。
  因みに、1個のEXE から複数回LoadLibrary しても同様です。

  よって、不可能ですネ!

  書き換えるか、新たに似て非なるものを作るしかないはずです。

  ここの最後に、その共有宣言設定の使用方法が掲載されてます。
  ttp://asdf.wkeya.com/code/begin4.html
  
以上。参考まで
Azuleanさん
オショウさん

返信ありがとうございました。
色々わかりました!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板