COM/OCX/ActiveX開発の落とし穴【32bit/64bit・登録・権限】

· · COM, ActiveX, OCX, Visual Studio, Windows開発, 32bit, 64bit, Interop

はじめに

COMコンポーネントやOCX/ActiveXの開発では、コードそのものより実行環境・登録・ホスト・権限の境界でハマることが多いです。よくある症状は次の通りです。

  • ビルドは通るのに起動時に 0x80040154 エラー
  • 開発機では動くのに他のPCでは動かない
  • 実行時は動くのにVisual Studioのデザイナーだけ壊れる
  • 管理者で起動したら動くのに通常権限では壊れる

1. まず結論

COM/OCX/ActiveXのトラブルは、次の4軸で整理すると早いです。

  1. bitness(32bit/64bit)が合っているか
  2. 登録方法が正しいか(regsvr32なのか、Regasmなのか)
  3. 登録先が正しいか(HKCU/HKLM、32bit/64bitビュー)
  4. 権限の問題か、それとも権限で別の登録が見えているだけか

2. 症状からの逆引き表

症状 まず疑うこと 本当の原因
0x80040154 未登録 別のビット数側だけに登録されている、特定ユーザーだけに登録されている
0x80070005 権限不足 標準ユーザーで登録しようとしている
VS2022でデザイナーだけ壊れる Designerの制約 32bitのCOMを64bitのVSが直接読めない
管理者でだけ動く 権限の問題 登録スコープやインストール設計のズレが原因

3. Visual Studio 2022の64bit化問題

Visual Studio 2022は devenv.exe が64bitのみです。そのため、32bitのCOM/ActiveXコンポーネントはデザイン時に直接ロードできません

結果として:

  • アプリはx86で実行時に動く
  • でもフォームデザイナーは64bitのVS上で動くため、32bit部品が読めずに落ちる

対策

  • AnyCPU にしても、依存先に32bit固定のCOMがあれば解決しない
  • Designerだけで使うコードがないか確認する
  • 可能なら対象コンポーネントの64bit版を用意する

4. System32とSysWOW64の罠

Windows x64では、フォルダ名と実際の役割が直感と逆です。

フォルダ 実際の役割
C:\Windows\System32 64bitアプリ用
C:\Windows\SysWOW64 32bitアプリ用
# 64bit DLL/OCXを登録
C:\Windows\System32\regsvr32.exe vendor.ocx

# x64 Windows上で32bit DLL/OCXを登録
C:\Windows\SysWOW64\regsvr32.exe vendor.ocx

間違った側に登録すると、regsvr32は成功するのに目的のプロセスから見えず 0x80040154 になります。

5. 登録方法の使い分け

公開したいもの 使うツール
ネイティブC++のDLL/OCX regsvr32
.NET FrameworkアセンブリをCOM公開 Regasm.exe
.NET 5+/6+/8+のCOM公開 生成された .comhost.dllregsvr32

よくあるミス

  • マネージドDLLに regsvr32 をかける → DllRegisterServer が見つからない
  • .NET Framework アセンブリに regsvr32 を使う → 登録されない

6. 管理者権限の問題

per-user登録とper-machine登録に注意

COMは検索時に以下の順で見ます。

  1. HKEY_CURRENT_USER\Software\Classes(ユーザーごと)
  2. HKEY_LOCAL_MACHINE\Software\Classes(マシン全体)

そのため:

  • 開発者Aが手動登録 → Aだけ動く、Bは動かない
  • 管理者で動くのは、HKCUに登録されたものが見えるから(という可能性がある)

対策

  • ビルドと登録は分ける(post-build eventでの自動登録は避ける)
  • マシン全体で使うならインストーラーでper-machine登録
  • 開発用だけなら明示的なセットアップスクリプトに閉じ込める
  • Registration-Free COMも検討する(レジストリ不要)

7. ActiveX/OCX固有の注意点

デザイン時ライセンスと実行時ライセンス

古いActiveXコントロールでは、開発時に貼り付けるためのライセンスと、実行時に使うライセンスが分かれていることがあります。「このコンポーネントのライセンスが見つからない」というエラーはこの違いが原因です。

STAとメッセージループ

UI系のOCX/ActiveXはSTA(シングルスレッドアパートメント)前提です。

  • UIスレッドでは動くが、Task.Run で投げると固まる
  • インターフェイスポインタを別スレッドに直接渡してはいけない

WinFormsでのラッパー

WinFormsはActiveXをそのままホストせず、Aximp.exe でラッパーを生成します。問題は「OCX本体 → タイプライブラリ → interop → AxHostラッパー」の複数層に分かれるため、1つの問題が連鎖しやすいです。

8. 現場で効く切り分け順

  1. ホストプロセスのbitnessを確認(何が、32bitか64bitか)
  2. 登録方法を確認(何を、何で登録すべきか)
  3. 登録先を確認(HKCU/HKLM、32bit/64bitビュー)
  4. 権限で隠れていないか確認(標準ユーザーと管理者で挙動が変わるか)

9. まとめ

COMトラブルの原因はほぼこの4つです。

  1. bitnessが合っていない
  2. 登録方法が間違っている
  3. 登録スコープがずれている
  4. 権限で見えているだけの状態を正常と思っている

コードを書く前に環境の前提を揃えることが最大の近道です。

関連する記事

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

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

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

記事を読む

Windows COMの設計が今でも優れている理由

COM の核となるインターフェース契約、IUnknown、GUID、参照カウントの考え方を整理し、バイナリ互換性やプロセス境界を越えた再利用といった強みが、現代のコンポーネント指向開発にも通じる理由を読み解きます。

記事を読む

関連トピック

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

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

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

ブログ一覧に戻る