none
32bit, 64bit共通で使えるdllを作りたい

    質問

  • dll開発初心者です。

    Visual Studio Community 2017で、
    「Visual C++」→「Windowsデスクトップ」→「ダイナミック リンク ライブラリ(DLL)」
    から作成可能なdllで、Excel VBA 32bit版, 64bit版両方から使用できるdllを作成しようとしています。

    個人的に調べた限りでは、
    x86(32Bit用)dllとx64(64Bit用)dllそれぞれを作成して、
    VBA側でどちらを使用するか、切り替えるのが表題の要件を満たす方法のようですが、
    これではdllをコールするVBA側でdllを呼び分ける処理が必要になってしまいます。

    これは仕方ないことなのでしょうか。

    もっと簡単に実現できる方法があれば、
    教えてください。

    宜しくお願いします。
    2018年5月1日 4:50

回答

  • 基本的に、Windows の DLL は x86/x64 で個別にならざる得ません。

    DLL の先頭には PE フォーマット に基づいたヘッダーがありますが、この中の COFF File Header の Machine フィールドがどのマシンをターゲットにしたものかを示すものとなっています。
    これは x86 だと IMAGE_FILE_MACHINE_I386、x64 だと IMAGE_FILE_MACHINE_AMD64 というように、どちらか一方を使うことになります。

    また、C++ でビルドした DLL は x86 向け、あるいは x64 向けのマシンコードになります。
    これらは別のプラットフォームに対する互換性がありません。

    このため、Windows の一般的な DLL としては x86、x64 で個別に用意することが必要になります。

    (.NET Framework で AnyCPU が実現できるのは、.NET Framework がプラットフォームを区別しない、DLL 読み込みをサポートしつつ、マシンコード自体ではなく、マシンコードに変換可能な中間言語(MSIL)の状態で DLL ができているからです)

    2018年5月1日 11:06
    モデレータ

すべての返信

  • 基本的に、Windows の DLL は x86/x64 で個別にならざる得ません。

    DLL の先頭には PE フォーマット に基づいたヘッダーがありますが、この中の COFF File Header の Machine フィールドがどのマシンをターゲットにしたものかを示すものとなっています。
    これは x86 だと IMAGE_FILE_MACHINE_I386、x64 だと IMAGE_FILE_MACHINE_AMD64 というように、どちらか一方を使うことになります。

    また、C++ でビルドした DLL は x86 向け、あるいは x64 向けのマシンコードになります。
    これらは別のプラットフォームに対する互換性がありません。

    このため、Windows の一般的な DLL としては x86、x64 で個別に用意することが必要になります。

    (.NET Framework で AnyCPU が実現できるのは、.NET Framework がプラットフォームを区別しない、DLL 読み込みをサポートしつつ、マシンコード自体ではなく、マシンコードに変換可能な中間言語(MSIL)の状態で DLL ができているからです)

    2018年5月1日 11:06
    モデレータ
  • 質問するときは最低限のマナーとして、実行環境 (OS, Officeのバージョンなど) に関する情報をきちんと書くようにしてください。
    DLLをどこに置こうとしていますか? 32bit向けのDLLと64bit向けのDLLのファイル名をまったく同じにして、64bit OS上では32bit版を%WinDir%/SysWOW64に、64bit版を%WinDir%/System32に配置すればいいんじゃないでしょうか。32bit OS上では%WinDir%/System32もしくは環境変数Pathが通っている場所に配置します。
    ただし、システムディレクトリにDLLをパブリックな共有モジュールとして配置する場合は、正しくバージョン管理しないとDLL地獄の原因になります。
    • 編集済み sygh 2018年5月1日 12:00
    2018年5月1日 11:32
  • 勉強になりました。

    C++でビルドしたDLLと.NETを利用してビルドしたDLLは別物なのですね。

    DLLの作り方を説明しているサイトは沢山ありますが、

    x86, x64両方で実行可能なDLLを紹介しているサイトと、個別にビルドしないといけないと説明しているサイトがあることが、私を混乱させていました。

    このフォーラムで質問して正解でした。

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

    2018年5月1日 12:52