none
参照されるdllファイルの優先順位を教えて頂けませんか? RRS feed

  • 質問

  • いつも大変お世話になっております。

    VB2008で開発しています。

    VC++2005で開発したActiveXのdllを参照設定して使用しています。

    このdllが私とは別な会社(A社)の方が作成したもので、
    このdllファイルと、私がVB2008で作成したexeの配布の仕組みが異なるため、
    優先順位がどうなっているだろうと疑問に思い質問させて頂きました。


    A社がdllファイルを修正すると、
    顧客の端末にレジストリ登録することになっています。【dll①】
    (regsvr32 xxx.dll)

    私が作成したexeはA社が作成したdllを参照しているため、
    配布すると、dllファイルもexeと同一階層に配布されます。【dll②】

    この場合、どちらのdllが使用されるのだろうと
    疑問に思ったため、質問させて頂きました。


    A社はdllファイルに不具合があると、
    修正してレジストリ登録することになっています。
    その際には、私にdllを渡して、exeも新しく作り直す必要があるのでしょうか?

    私なりに以下の条件で試してみたところ、レジストリのdllが優先されているようでした。
    ・古いdllファイルを参照に追加してexeを配布する。
     (この際、同一階層にdllファイルも配布されます。)
     (配布の仕組みはClickOnceを利用しています。)
    ・新しいdllファイルをレジストリに登録する。
     (regsvr32 xxx.dllで登録しています。)
     (exeと同時に配布したdllとは違うパスに置いています。)

    この場合に新しいdllファイルの機能が実行されていたため、
    レジストリ登録したdllファイルが優先されているのだろうと思いました。


    以上のような状態なのですが、
    A社は、dllファイルを修正したら、私もexeの参照設定をしなおして、
    新たに配布し直す必要があるのでしょうか?
    大事な問題なのですが、問題ないという確信を持てなかったため、
    質問させて頂きました。

    長文の質問で、少し説明が分かりにくいかもしれませんが、
    ぜひご回答よろしくお願い致します。



    2009年3月27日 2:46

回答

  • コンドル さん の発言:

    A社はdllファイルに不具合があると、
    修正してレジストリ登録することになっています。
    その際には、私にdllを渡して、exeも新しく作り直す必要があるのでしょうか?

    インターフェースやGUID等が変わっていなければ基本的にexeを作り直す必要はありません。
    (メソッドの追加や型の追加、順番の入れ替え、引数の変更等があると作り直す必要があります)


    コンドル の発言:

    私なりに以下の条件で試してみたところ、レジストリのdllが優先されているようでした。
    ・古いdllファイルを参照に追加してexeを配布する。
     (この際、同一階層にdllファイルも配布されます。)
     (配布の仕組みはClickOnceを利用しています。)
    ・新しいdllファイルをレジストリに登録する。
     (regsvr32 xxx.dllで登録しています。)
     (exeと同時に配布したdllとは違うパスに置いています。)

    この場合に新しいdllファイルの機能が実行されていたため、
    レジストリ登録したdllファイルが優先されているのだろうと思いました。

    原則は、実験された結果の通り、レジストリに設定されているパスが優先されます。
    但し、必ずしもそうだとは限りません。

    Windows 2000から導入された.localファイルによるリダイレクトや、Windows XP以降で.localを置き換えるように登場した.manifestの仕組みによって読み込み順序は変わります。
    (特に設置/設定していなければ機能しないはず)
    http://msdn.microsoft.com/en-us/library/aa375142(VS.85).aspx
    http://msdn.microsoft.com/en-us/library/aa376307(VS.85).aspx

    コンドル さん の発言:

    A社は、dllファイルを修正したら、私もexeの参照設定をしなおして、
    新たに配布し直す必要があるのでしょうか?

    前述の条件に沿う限り、exeを作り直す必要も参照設定をやり直す必要もありません。


    Michael-K さん の発言:

    しかし、しばしば、新しいdllを参照できない、事態が起こります。
    DLL Hellと呼ばれるものです。

    どういった意図で書かれたのか読み取れませんでしたが、不安を煽るだけでなく、どういった現象か説明するか、情報源を提示しましょう。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク コンドル 2009年3月29日 3:54
    2009年3月27日 14:15
    モデレータ
  •  regsvr32で登録された、dllが、参照されます。
    dllが、上位互換で、アップデートされた場合、新しいdllをregsvr32で登録するだけで、大丈夫です。
    しかし、しばしば、新しいdllを参照できない、事態が起こります。
    DLL Hellと呼ばれるものです。
    • 回答としてマーク コンドル 2009年3月29日 3:54
    2009年3月27日 5:25

すべての返信

  •  regsvr32で登録された、dllが、参照されます。
    dllが、上位互換で、アップデートされた場合、新しいdllをregsvr32で登録するだけで、大丈夫です。
    しかし、しばしば、新しいdllを参照できない、事態が起こります。
    DLL Hellと呼ばれるものです。
    • 回答としてマーク コンドル 2009年3月29日 3:54
    2009年3月27日 5:25
  • コンドル さん の発言:

    A社はdllファイルに不具合があると、
    修正してレジストリ登録することになっています。
    その際には、私にdllを渡して、exeも新しく作り直す必要があるのでしょうか?

    インターフェースやGUID等が変わっていなければ基本的にexeを作り直す必要はありません。
    (メソッドの追加や型の追加、順番の入れ替え、引数の変更等があると作り直す必要があります)


    コンドル の発言:

    私なりに以下の条件で試してみたところ、レジストリのdllが優先されているようでした。
    ・古いdllファイルを参照に追加してexeを配布する。
     (この際、同一階層にdllファイルも配布されます。)
     (配布の仕組みはClickOnceを利用しています。)
    ・新しいdllファイルをレジストリに登録する。
     (regsvr32 xxx.dllで登録しています。)
     (exeと同時に配布したdllとは違うパスに置いています。)

    この場合に新しいdllファイルの機能が実行されていたため、
    レジストリ登録したdllファイルが優先されているのだろうと思いました。

    原則は、実験された結果の通り、レジストリに設定されているパスが優先されます。
    但し、必ずしもそうだとは限りません。

    Windows 2000から導入された.localファイルによるリダイレクトや、Windows XP以降で.localを置き換えるように登場した.manifestの仕組みによって読み込み順序は変わります。
    (特に設置/設定していなければ機能しないはず)
    http://msdn.microsoft.com/en-us/library/aa375142(VS.85).aspx
    http://msdn.microsoft.com/en-us/library/aa376307(VS.85).aspx

    コンドル さん の発言:

    A社は、dllファイルを修正したら、私もexeの参照設定をしなおして、
    新たに配布し直す必要があるのでしょうか?

    前述の条件に沿う限り、exeを作り直す必要も参照設定をやり直す必要もありません。


    Michael-K さん の発言:

    しかし、しばしば、新しいdllを参照できない、事態が起こります。
    DLL Hellと呼ばれるものです。

    どういった意図で書かれたのか読み取れませんでしたが、不安を煽るだけでなく、どういった現象か説明するか、情報源を提示しましょう。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク コンドル 2009年3月29日 3:54
    2009年3月27日 14:15
    モデレータ
  •  regsvr32で登録された、dllが、参照されます。
    dllが、上位互換で、アップデートされた場合、新しいdllをregsvr32で登録するだけで、大丈夫です。
    しかし、しばしば、新しいdllを参照できない、事態が起こります。
    DLL Hellと呼ばれるものです。

    Michael-K様

    ご回答ありがとうございます。

    DLL Hellですか。
    心配ですので、調査させて頂きます。

    とても参考になりました。
    ありがとうございます。
    2009年3月29日 2:54

  • Azulean様

    ご回答ありがとうございました。

    インターフェースやGUID等が変わっていなければ基本的にexeを作り直す必要はありません。
    (メソッドの追加や型の追加、順番の入れ替え、引数の変更等があると作り直す必要があります)

    良かったです。
    とても安心しました。

    原則は、実験された結果の通り、レジストリに設定されているパスが優先されます。
    但し、必ずしもそうだとは限りません。

    Windows 2000から導入された.localファイルによるリダイレクトや、Windows XP以降で.localを置き換えるように登場した.manifestの仕組みによって読み込み順序は変わります。
    (特に設置/設定していなければ機能しないはず)
    http://msdn.microsoft.com/en-us/library/aa375142(VS.85).aspx
    http://msdn.microsoft.com/en-us/library/aa376307(VS.85).aspx


    特別なマニフェストファイルは使用しておりませんので、
    問題なさそうですね。

    例外的な情報までご説明頂きありがとうございました。
    大変参考になりました。

    ありがとうございました。
     

    2009年3月29日 2:58