COM/OCX/ActiveX開発の落とし穴【32bit/64bit・登録・権限】
はじめに
COMコンポーネントやOCX/ActiveXの開発では、コードそのものより実行環境・登録・ホスト・権限の境界でハマることが多いです。よくある症状は次の通りです。
- ビルドは通るのに起動時に
0x80040154エラー - 開発機では動くのに他のPCでは動かない
- 実行時は動くのにVisual Studioのデザイナーだけ壊れる
- 管理者で起動したら動くのに通常権限では壊れる
1. まず結論
COM/OCX/ActiveXのトラブルは、次の4軸で整理すると早いです。
- bitness(32bit/64bit)が合っているか
- 登録方法が正しいか(regsvr32なのか、Regasmなのか)
- 登録先が正しいか(HKCU/HKLM、32bit/64bitビュー)
- 権限の問題か、それとも権限で別の登録が見えているだけか
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.dll を regsvr32 |
よくあるミス
- マネージドDLLに
regsvr32をかける →DllRegisterServerが見つからない .NET Frameworkアセンブリにregsvr32を使う → 登録されない
6. 管理者権限の問題
per-user登録とper-machine登録に注意
COMは検索時に以下の順で見ます。
HKEY_CURRENT_USER\Software\Classes(ユーザーごと)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. 現場で効く切り分け順
- ホストプロセスのbitnessを確認(何が、32bitか64bitか)
- 登録方法を確認(何を、何で登録すべきか)
- 登録先を確認(HKCU/HKLM、32bit/64bitビュー)
- 権限で隠れていないか確認(標準ユーザーと管理者で挙動が変わるか)
9. まとめ
COMトラブルの原因はほぼこの4つです。
- bitnessが合っていない
- 登録方法が間違っている
- 登録スコープがずれている
- 権限で見えているだけの状態を正常と思っている
コードを書く前に環境の前提を揃えることが最大の近道です。
関連する記事
同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。
Office 2024 / Microsoft 365 で ActiveX が動かないときの対処ガイド
Office 2024 と Microsoft 365 で ActiveX が動かない原因を、設定既定値、bitness、COM 登録、依存ランタイム、IE モードの順で切り分ける実務手順をまとめた現場向けガイドです。
COM/ActiveX/OCXの違いを徹底解説
COM・ActiveX・OCX の違いを土台と部品とファイルという三層で整理し、OLE との関係や IE モードを含む現代の実務での扱い方、調査の観点や残す判断の目安までコンパクトにまとめた解説記事です。
ActiveX/OCXの残す・包む・置き換える判断表
ActiveX や OCX をどう扱うか迷ったときに、残す・包む・置き換えるの三択を 32bit / 64bit やブラウザ依存、ベンダー保守、登録手順まで含めて整理する判断表と移行チェックリストをまとめた記事です。
32bit→64bit DLL呼出しをCOMブリッジで実現する方法
32bit プロセスは 64bit DLL を直接ロードできないという Windows の制約を起点に、Out-of-proc COM サーバーで橋渡しする構成、IDL とマーシャリング、性能上の注意点まで C# のサンプル付きで整理します。
Windows COMの設計が今でも優れている理由
COM の核となるインターフェース契約、IUnknown、GUID、参照カウントの考え方を整理し、バイナリ互換性やプロセス境界を越えた再利用といった強みが、現代のコンポーネント指向開発にも通じる理由を読み解きます。
関連トピック
このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。
Windows技術トピック
Windows 開発、不具合調査、既存資産活用の技術トピックをまとめた入口です。
ActiveX / 移行テーマ
COM / ActiveX / OCX を残すか、包むか、置き換えるかを整理するトピックです。
32bit / 64bit テーマ
32bit / 64bit、ネイティブ連携、C++/CLI まわりを整理するトピックです。
このテーマがつながるサービス
この記事は次のサービスページにつながります。近い入口からご覧ください。
Windowsアプリ開発
業務アプリ、装置連携、通信ツールなどの Windows ソフト開発を支援します。
既存資産活用・移行支援
COM / ActiveX / OCX、32bit / 64bit 制約を抱える既存資産の活用と移行を支援します。