32bit→64bit DLL呼出しをCOMブリッジで実現する方法

· · COM, Windows開発, 32bit, 64bit

どんな問題か

32bitの既存アプリケーションを保ったまま、64bit DLLの処理を使いたい場合の話です。

重要な制約:32bitプロセスは64bit DLLをロードできません。これはWindows OSレベルでの制約です。同一プロセス内での呼び出しは不可能です。

よくある状況:

  • 既存の32bitアプリが大きく、すぐには64bitに移行できない
  • 64bit版のライブラリにしか新機能がない
  • 32bit側から「型安全に」呼び出したい

解決策:COM ブリッジ

解決の基本は、64bitの処理を別プロセスに逃がして、COMで橋渡しすることです。

構成

[32bitアプリ] → [COM Proxy] → [RPC/IPC] → [COM Stub] → [64bit COMサーバー(EXE)] → [64bit DLL]

流れ

  1. 64bitのCOM LocalServer(EXE)を作り、その中で64bit DLLを呼び出す
  2. COMインターフェース(IDL/TypeLib)を共有し、型を公開する
  3. 32bitアプリはCOM経由で「型付き」で呼び出す

注意点

  • 32bitと64bitのレジストリ登録は別物(WOW6432Nodeに注意)
  • 独自の構造体を使う場合はマーシャリング設計が必要
  • プロセス間通信のオーバーヘッドがあるため、高頻度の呼び出しより一括処理が望ましい

処理の流れ(シーケンス図)

32bitクライアントアプリ
    ↓ ICalcService.Add(1, 2)  — 型安全なCOM呼び出し
COM Proxy(32bit側)
    ↓ パラメータをシリアライズ
RPC/IPC(プロセス間通信)
    ↓ プロセス境界を越えて転送
COM Stub(64bit側)
    ↓ パラメータを復元
64bit COM Server(EXE)
    ↓ ネイティブ関数呼び出し
64bit DLL
    ↓ 計算実行
結果を逆方向に返送

サンプルコード(C#)

共有インターフェース定義

[ComVisible(true)]
[Guid("7A4B5B23-0A2F-4D2B-9D4D-8A2A92B8B001")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ICalcService
{
    int Add(int a, int b);
}

64bit COMサーバー側の実装

[ComVisible(true)]
[Guid("1C9B6F4D-1E9A-4E61-9A4F-6A0F1D2D9A11")]
[ClassInterface(ClassInterfaceType.None)]
public class CalcService : ICalcService
{
    public int Add(int a, int b)
    {
        // 64bit DLLのネイティブ関数を呼び出す
        return NativeDll.Add(a, b);
    }
}

32bitアプリ側の呼び出し

Type t = Type.GetTypeFromProgID("KomuraSoft.CalcService");
var calc = (ICalcService)Activator.CreateInstance(t);
int result = calc.Add(1, 2);  // 結果: 3

32bitアプリ側は ICalcService インターフェースを通じて型安全に呼び出せます。COMが内部でProxy/Stubを使い、IPC経由で自動転送してくれます。

完全なサンプル

GitHubに動作するサンプルを公開しています。

Call64bitDLLFrom32bitProc - GitHub

含まれるもの:

  • Call64bitDLLFrom32bitProc/ — 64bit COM LocalServer (EXE)
  • X64DLL/ — 64bit DLL(実際の処理)
  • X86App/ — 32bit クライアントアプリ (WinForms)
  • scripts/ — COMサーバーの登録・解除スクリプト

まとめ

  • 32bitアプリから64bit DLLを直接呼び出すことはOSレベルで不可能
  • Out-of-proc COM を使えば、64bitの処理を別プロセスとして分離できる
  • COMがProxy/Stubによるマーシャリングを自動で処理する
  • 高頻度呼び出しではプロセス間通信のオーバーヘッドに注意
  • 実務では、一括処理APIを設計するのが現実的

参考リンク

関連する記事

同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。

Reg-Free COM 入門【レジストリ不要のCOM】

Reg-Free COMの仕組みを、アクティベーションコンテキストとマニフェストの役割から整理します。XCOPY配布や版の共存といった利点と、bitnessや設計時参照といった限界、向き不向きの判断軸まで実務目線でまとめます。

記事を読む

Excel帳票出力の方式選定ガイド

Excel 帳票出力を Windows アプリやサーバー処理にどう組み込むかを、COM 自動化、Open XML 直接生成、テンプレート差し込み、既存 VBA 活用の四方式で比較し、要件別の選び方や設計時のハマりどころまでまとめた判断表です。

記事を読む

COM/ActiveX/OCXの違いを徹底解説

COM・ActiveX・OCX の違いを土台と部品とファイルという三層で整理し、OLE との関係や IE モードを含む現代の実務での扱い方、調査の観点や残す判断の目安までコンパクトにまとめた解説記事です。

記事を読む

関連トピック

このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。

このテーマがつながるサービス

この記事は次のサービスページにつながります。近い入口からご覧ください。

ブログ一覧に戻る