none
LoadLibraryEx、GetProcAddressを使わないでDLLを入れ替えたい RRS feed

  • 質問

  • VC++2010のMFCアプリ同士のEXEとDLLの呼び出しですが
    DLLだけを将来入れ替えることがあり得るので、

    LoadLibraryEx、GetProcAddressを使ってexeからdllをコールしようとしたのですが
    これだと、関数を直接呼び出せないですよね・・・と言う言い方も変なのですが

    あくまで関数のハンドラに対しての操作になると思います
    出来れば関数はexeから直接呼び出したいのです

    通常のexeとdllであれば、dll用のlibファイルをリンク指定し、ヘッダファイルをインクルードして関数を使いますが
    それだとDLLを入れ替えるたびにexeのリコンパイルが必要になってしまいます

    ただ、デバイスドライバのDLLなんかはわざわざリコンパイルしなくても、インストールし直すと、DLLが新しくなってもEXEファイルはそのまま使えることが多いです
    これはどのような仕組みによって実現しているのでしょう

    VC++がよくわかっていないので、変な質問かもしれませんが、よろしくお願いします

    2011年6月25日 17:04

回答

  • >それだとDLLを入れ替えるたびにexeのリコンパイルが必要になってしまいます

    そんなことはありません。

    exe から呼び出している dll 関数が新バージョンの dll に存在し、呼び出し規約や引数の数や型に変化がなければ、dll のみ入れ替えても正常に新バージョンの dll の dll 関数を呼び出せます。(期待通りに正しく動作するかどうかは dll 側の実装の変化の度合い次第です)

     

    2011年6月25日 19:36

すべての返信

  • >それだとDLLを入れ替えるたびにexeのリコンパイルが必要になってしまいます

    そんなことはありません。

    exe から呼び出している dll 関数が新バージョンの dll に存在し、呼び出し規約や引数の数や型に変化がなければ、dll のみ入れ替えても正常に新バージョンの dll の dll 関数を呼び出せます。(期待通りに正しく動作するかどうかは dll 側の実装の変化の度合い次第です)

     

    2011年6月25日 19:36
  • ありがとうございます。
    ということは、DLL内に新しい関数を作って、入れ替えたとして(他の関数はそのままで)
    EXEは再コンパイルせずに使えるのはたまたまうまくいってるわけでは無く
    ちゃんと呼び出せていると言うことですね

    libファイルはDLL内の関数のアドレスでは無く名前と引数が直接書き込まれているみたいですね

    2011年6月26日 16:12