32bit→64bit DLL呼出しをCOMブリッジで実現する方法
どんな問題か
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]
流れ
- 64bitのCOM LocalServer(EXE)を作り、その中で64bit DLLを呼び出す
- COMインターフェース(IDL/TypeLib)を共有し、型を公開する
- 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を設計するのが現実的
参考リンク
関連する記事
同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。
COM/OCX/ActiveX開発の落とし穴【32bit/64bit・登録・権限】
COM コンポーネントや OCX、ActiveX の開発で頻発する 32bit と 64bit の不整合、regsvr32 と Regasm の使い分け、HKCU と HKLM の登録スコープ、管理者権限や STA まで、現場の切り分け手順を整理した記事です。
Office 2024 / Microsoft 365 で ActiveX が動かないときの対処ガイド
Office 2024 と Microsoft 365 で ActiveX が動かない原因を、設定既定値、bitness、COM 登録、依存ランタイム、IE モードの順で切り分ける実務手順をまとめた現場向けガイドです。
Reg-Free COM 入門【レジストリ不要のCOM】
Reg-Free COMの仕組みを、アクティベーションコンテキストとマニフェストの役割から整理します。XCOPY配布や版の共存といった利点と、bitnessや設計時参照といった限界、向き不向きの判断軸まで実務目線でまとめます。
Excel帳票出力の方式選定ガイド
Excel 帳票出力を Windows アプリやサーバー処理にどう組み込むかを、COM 自動化、Open XML 直接生成、テンプレート差し込み、既存 VBA 活用の四方式で比較し、要件別の選び方や設計時のハマりどころまでまとめた判断表です。
COM/ActiveX/OCXの違いを徹底解説
COM・ActiveX・OCX の違いを土台と部品とファイルという三層で整理し、OLE との関係や IE モードを含む現代の実務での扱い方、調査の観点や残す判断の目安までコンパクトにまとめた解説記事です。
関連トピック
このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。
Windows技術トピック
Windows 開発、不具合調査、既存資産活用の技術トピックをまとめた入口です。
ActiveX / 移行テーマ
COM / ActiveX / OCX を残すか、包むか、置き換えるかを整理するトピックです。
32bit / 64bit テーマ
32bit / 64bit、ネイティブ連携、C++/CLI まわりを整理するトピックです。
このテーマがつながるサービス
この記事は次のサービスページにつながります。近い入口からご覧ください。
Windowsアプリ開発
業務アプリ、装置連携、通信ツールなどの Windows ソフト開発を支援します。
既存資産活用・移行支援
COM / ActiveX / OCX、32bit / 64bit 制約を抱える既存資産の活用と移行を支援します。