COM/OCX/ActiveXの登録トラブル
type: Concept
definition: bitness・登録先・ホスト・権限の不一致によって起きる、COMやOCX/ActiveXの典型的な登録トラブル群。
uses: WOW64レジストリリダイレクター
uses: Visual Studio 2022

Visual Studio 2022
type: Concept
definition: devenv.exeが64bit onlyになったバージョンのVisual Studio。
alternative label: devenv.exe

WOW64レジストリリダイレクター
type: Concept
definition: 64bit Windows上で32bitアプリと64bitアプリに別々のレジストリviewを見せる仕組み。HKLM\SOFTWARE\Classes直下は共有される一方、CLSIDサブキー配下は32bit側と64bit側で別になる。
alternative label: レジストリリダイレクタ

ActiveX
type: Concept
definition: 実務ではCOMベースのコントロールやその周辺資産をまとめて指す言葉として使われる技術群。特に.ocx形式のUIコントロールやIE/コンテナへ埋め込む部品を含むことが多い。
alternative label: ActiveXコントロール
broader: COM(コンポーネントオブジェクトモデル)

OCX
type: Concept
definition: ActiveXコントロールの実体を持つ.ocx形式のファイル。in-procの形態でホストプロセスに読み込まれる。
alternative label: .ocxファイル
alternative label: OLEカスタムコントロール
broader: ActiveX
requires: bitness一致要件
implements: ActiveX

bitness一致要件
type: Concept
definition: ネイティブモジュール(in-procのCOMコンポーネント、P/Invokeで呼ぶDLL、ベンダー提供SDKのDLLなど)を読み込むホストプロセスと、そのモジュールのビット構成(32bit/64bit)が一致していなければならないという制約。
alternative label: 32bit/64bitの一致
alternative label: bitness match

COM(コンポーネントオブジェクトモデル)
type: Concept
definition: 公開インターフェース、レジストリ登録、Apartment Modelなどを土台にした、Windowsのバイナリ互換コンポーネントモデル。
alternative label: Component Object Model
uses: HKEY_CURRENT_USER\Software\Classes

HKEY_CURRENT_USER\Software\Classes
type: Concept
definition: COMがコンピューター全体の情報を見る前に先に参照する、そのユーザーだけに見えるCOMクラス登録の場所。
alternative label: HKCU\Software\Classes

CLSID(Class ID)
type: Concept
definition: COMコンポーネントの実装(クラス)を一意に指すGUID。レジストリ上の登録の鍵になる識別子。
alternative label: Class ID
broader: COM(コンポーネントオブジェクトモデル)
stored in: HKEY_CLASSES_ROOT(HKCR)

WOW6432Node
type: Concept
definition: 64bit Windows上で32bitアプリ向けのレジストリ内容が物理的に置かれる場所。

regsvr32
type: Concept
definition: DLLやOCXなどのCOMコンポーネントをレジストリへ登録・登録解除するコマンドラインツール。
alternative label: regsvr32.exe
uses: In-proc COM(DLLサーバー)
not recommended for: .NET Framework
uses: WOW64ファイルシステムリダイレクター
uses: .NET(5以降)のEnableComHosting/.comhost.dll

In-proc COM(DLLサーバー)
type: Concept
definition: COMコンポーネントを呼び出し側と同じプロセスに読み込んで使う形態。
alternative label: DLLサーバー

Regasm.exe
type: Concept
definition: .NET FrameworkのアセンブリをCOMへ登録するための登録ツール。
alternative label: RegAsm
recommended for: .NET Framework

.NET Framework
type: Concept
definition: Windowsのコンポーネントとして扱われ、インストールされているOSのライフサイクルに沿ってサポートされるランタイム。System.Messagingの対象範囲。

.NET(5以降)のEnableComHosting/.comhost.dll
type: Concept
definition: .NET 5以降でCOM公開を行うための仕組み。ビルド時に.comhost.dllを生成しregsvr32で登録する(既定でin-procのみ)。
alternative label: comhost.dll
alternative label: EnableComHosting
recommended for: .NET(Core以降)

.NET(Core以降)
type: Concept
definition: .NET Frameworkの後継となる、クロスプラットフォーム対応の.NETランタイム(.NET 5以降)。
alternative label: .NET Core
alternative label: モダンな.NET

WOW64ファイルシステムリダイレクター
type: Concept
definition: x64 Windows上で、64bitアプリ用の%windir%\System32と32bitアプリ向けの別の場所(SysWOW64)を振り分ける仕組み。
alternative label: File System Redirector

管理者権限
type: Concept
definition: コンピューター全体の設定を変更できる権限。
alternative label: 昇格

0x80040154(Class not registered)
type: Concept
definition: 公式にはREGDB_E_CLASSNOTREGと呼ばれるCOMのエラーで、完全な未登録だけでなく、別ビット数側のレジストリviewにだけ登録されている場合や、そのユーザーにしか見えないHKCU側にだけ登録されている場合にも起きる。
alternative label: REGDB_E_CLASSNOTREG

per-user登録
type: Concept
definition: そのユーザーのアカウントだけで有効な、開発機での手動登録などに使われるCOM登録のスコープ。
alternative label: ユーザー単位の登録

HKEY_CLASSES_ROOT(HKCR)
type: Concept
definition: HKLM\Software\ClassesとHKCU\Software\Classesのmerged view。
alternative label: HKCR
inherits: HKEY_LOCAL_MACHINE\Software\Classes
inherits: HKEY_CURRENT_USER\Software\Classes

HKEY_LOCAL_MACHINE\Software\Classes
type: Concept
definition: そのマシンの全ユーザーに見える、コンピューター全体のCOMクラス登録の場所。
alternative label: HKLM\Software\Classes
uses: WOW64レジストリリダイレクター

per-machine登録
type: Concept
definition: そのマシンの全ユーザーで有効な、インストーラーで行うべきCOM登録のスコープ。
alternative label: マシン単位の登録
requires: 管理者権限

ActiveXのデザイン時/実行時ライセンス
type: Concept
definition: 古いActiveXコントロールで、フォームへの貼り付け(デザイン時)と実行時とで別々に必要になることがあるライセンスの仕組み。
alternative label: design-time license
alternative label: run-time license
alternative label: .LIC

AxImp(ActiveX Control Importer)
type: Concept
definition: .NET Framework付属のツールで、OCXからCOM型のランタイム呼び出し可能ラッパーと、AxHost派生のWindows Forms用ラッパーアセンブリを生成する。生成ファイル名はProgIDから決まる。
alternative label: Aximp.exe
alternative label: ActiveX Control Importer
requires: 型ライブラリ(TLB)
uses: AxHost

型ライブラリ(TLB)
type: Concept
definition: インターフェース、メソッド、引数の型といった型情報をバイナリで持つファイル。VB6や.NETから型付きでCOMを呼び出す際の情報源になる。
alternative label: Type Library
alternative label: TLB
broader: COM(コンポーネントオブジェクトモデル)

AxHost
type: Concept
definition: Windows Forms上でActiveXコントロールをホストするための基底クラス。
alternative label: AxHost Class
implements: ActiveX

COMアパートメントモデル(STA/MTA)
type: Concept
definition: どのスレッドからCOMコンポーネントを呼んでよいかを決める、COMのスレッドモデルの約束。
alternative label: STA
alternative label: MTA
alternative label: Single/Multi Threaded Apartment
broader: COM(コンポーネントオブジェクトモデル)
requires: CoInitializeEx
requires: マーシャリング

メッセージループ
type: Concept
definition: スレッドがGetMessage/DispatchMessageなどで自分のウィンドウ宛てのメッセージを順に取り出し処理し続ける仕組み。入力・描画・イベント処理を担うと同時に、STAが持つOleMainThreadWndClassという隠しウィンドウ宛てに届く、別アパートメントからの呼び出しメッセージもここでディスパッチされる。
alternative label: OleMainThreadWndClass
broader: COMアパートメントモデル(STA/MTA)
prevents: STAスレッドのブロックによるデッドロック

CoInitializeEx
type: Concept
definition: COMを使う各スレッドが個別に呼んで初期化する必要があるWin32 API。

STAスレッドのブロックによるデッドロック
type: Concept
definition: UIスレッドでTask.Wait()やWaitOneなどの同期待ちを行うと、メッセージの取り出しが止まりCOMのコールバックとアパートメント間の呼び出しが配達されなくなり、デッドロックになる状態。

マーシャリング
type: Concept
definition: プロセス境界だけでなく、同一プロセス内のCOMアパートメント境界やマネージド/ネイティブ境界のような呼び出し境界を越えて、引数や戻り値をやり取りできる形に詰め直すこと。
alternative label: marshaling
alternative label: Marshaling
alternative label: Marshalling

Reg-Free COM(登録不要COM)
type: Concept
definition: レジストリ登録なしに、アプリ側のマニフェストに書いたCLSIDやProgIDなどの情報でCOMコンポーネントを解決する仕組み。
alternative label: Registration-Free COM
alternative label: side-by-side
broader: COM(コンポーネントオブジェクトモデル)
uses: アセンブリマニフェスト
mitigates: COM/OCX/ActiveXの登録トラブル

アセンブリマニフェスト
type: Concept
definition: どのファイルがどのCLSIDを提供するかをcomClass要素で宣言する、Reg-Free COMで使うマニフェストファイル。依存側のassemblyIdentityはコンポーネント側と完全に一致していなければならない。
alternative label: comClass

COM LocalServer(別プロセスCOMサーバー)
type: Concept
definition: COMサーバーをEXEとして別プロセスで動かす形態。bitnessの壁を越えたり、クラッシュを隔離したりできる。レジストリのCLSID配下のLocalServer32キーにEXEパスを登録する。
alternative label: LocalServer32
alternative label: out-of-proc COMサーバー
broader: COM(コンポーネントオブジェクトモデル)
requires: CLSID(Class ID)

ProgID(Programmatic Identifier)
type: Concept
definition: CLSIDに付けた、人が読める文字列の名前。`Excel.Application`のような形でCLSIDに対応付けられる。
alternative label: Programmatic Identifier
broader: COM(コンポーネントオブジェクトモデル)
requires: CLSID(Class ID)

subject: COM/OCX/ActiveXの登録トラブル
predicate: uses
object: WOW64レジストリリダイレクター
description: COM/ActiveXの登録トラブルの多くは、CLSIDサブキーが32bit viewと64bit viewで別になるWOW64レジストリリダイレクターの理解不足から生じる。
evidence: registry-redirector
verified at: 2026-08-01
certainty: established

subject: COM/OCX/ActiveXの登録トラブル
predicate: uses
object: Visual Studio 2022
description: Visual Studio 2022がdevenv.exeとして64bitプロセスになったことで、32bit前提のデザイン時連携が壊れる問題が表面化しやすくなった。
evidence: release-notes-v17.0
verified at: 2026-08-01
certainty: established

subject: Visual Studio 2022
predicate: incompatibleWith
object: ActiveX
description: Visual Studio 2022は64bitプロセスのため、x86固定のCOM/ActiveXコンポーネントをデザイン時に直接ロードできない。AnyCPUにしても、依存先が32bit固定のActiveXなら問題は残る。
evidence: troubleshoot-32bit
verified at: 2026-08-01
certainty: context-dependent

subject: OCX
predicate: requires
object: bitness一致要件
description: in-procのOCXは読み込むホストプロセスとビット構成(32bit/64bit)を揃える必要があり、64bitアプリから32bit OCXを直接呼ぶことはできない。
evidence: 32-bit-and-64-bit-interoperability
verified at: 2026-08-01
certainty: established

subject: OCX
predicate: implements
object: ActiveX
description: OCXはActiveXコントロールの実体を持つ.ocx形式のファイルである。
evidence: activex-controls
verified at: 2026-08-01
certainty: established

subject: COM(コンポーネントオブジェクトモデル)
predicate: uses
object: HKEY_CURRENT_USER\Software\Classes
description: COMはHKEY_CURRENT_USER\Software\Classesを先に見てから、コンピューター全体の情報を扱う。
evidence: classes-and-servers
verified at: 2026-08-01
certainty: established

subject: CLSID(Class ID)
predicate: storedIn
object: WOW6432Node
description: 64bit Windows上で32bitのCOMクラスを登録した場合、CLSIDの配下はWOW64のリダイレクト対象となり、物理的な置き場所はWow6432Nodeになる。64bit登録はネイティブビューに置かれ、32bit WindowsにはWow6432Nodeの分岐自体がない
evidence: shared-registry-keys
verified at: 2026-08-01
certainty: context-dependent

subject: regsvr32
predicate: uses
object: In-proc COM(DLLサーバー)
description: regsvr32はDllRegisterServer/DllUnregisterServerをエクスポートするネイティブのin-proc COMサーバー(DLL/OCX)向けの登録コマンドである。
evidence: regsvr32
verified at: 2026-08-01
certainty: established

subject: Regasm.exe
predicate: recommendedFor
object: .NET Framework
description: COMで使用する.NET Frameworkアセンブリの登録にはRegasm.exeを使う。
evidence: regasm-exe-assembly-registration-tool
verified at: 2026-08-01
certainty: established

subject: regsvr32
predicate: notRecommendedFor
object: .NET Framework
description: regsvr32は何でも登録できる汎用コマンドではなく、.NET Frameworkアセンブリの登録には向かない。
evidence: regasm-exe-assembly-registration-tool
verified at: 2026-08-01
certainty: established

subject: .NET(5以降)のEnableComHosting/.comhost.dll
predicate: recommendedFor
object: .NET(Core以降)
description: .NET 5+/6+/8+のCOM公開ではEnableComHostingを設定してビルドし、生成された.comhost.dllをregsvr32で登録する。
evidence: expose-components-to-com
verified at: 2026-08-01
certainty: established

subject: regsvr32
predicate: uses
object: WOW64ファイルシステムリダイレクター
description: x64 WindowsではSystem32用とSysWOW64用のregsvr32を使い分ける必要があり、これはWOW64のファイルシステムリダイレクターによる32bit側の別配置に対応する。
evidence: file-system-redirector
verified at: 2026-08-01
certainty: established

subject: regsvr32
predicate: requires
object: 管理者権限
description: 標準ユーザーでregsvr32を実行するとレジストリやSystem32へ書き込めず0x80070005になることがある。
evidence: dllregisterserver-error
verified at: 2026-08-01
certainty: context-dependent

subject: WOW64レジストリリダイレクター
predicate: mayCause
object: 0x80040154(Class not registered)
description: 対象が別のレジストリviewにだけ登録されている場合、正しいCLSIDが見えず0x80040154(Class not registered)になり得る。
evidence: registry-redirector
verified at: 2026-08-01
certainty: context-dependent

subject: per-user登録
predicate: mayCause
object: 0x80040154(Class not registered)
description: そのユーザーにしか見えないHKCU側にだけ登録されている場合も、他のユーザーやサービスアカウントからは0x80040154になり得る。
evidence: merged-view-of-hkey-classes-root
verified at: 2026-08-01
certainty: context-dependent

subject: HKEY_CLASSES_ROOT(HKCR)
predicate: inherits
object: HKEY_LOCAL_MACHINE\Software\Classes
description: HKEY_CLASSES_ROOTは、HKLM\Software\Classesの内容を継承して見せるmerged viewの一方の入力である。
evidence: merged-view-of-hkey-classes-root
verified at: 2026-08-01
certainty: established

subject: HKEY_CLASSES_ROOT(HKCR)
predicate: inherits
object: HKEY_CURRENT_USER\Software\Classes
description: HKEY_CLASSES_ROOTは、HKCU\Software\Classesの内容を継承して見せるmerged viewのもう一方の入力である。
evidence: merged-view-of-hkey-classes-root
verified at: 2026-08-01
certainty: established

subject: per-machine登録
predicate: requires
object: 管理者権限
description: 管理者権限を必要とするアプリケーションは、依存COMオブジェクトをインストール時にper-machineのCOM構成ストアへ登録するべきとされる。
evidence: hkey-classes-root-key
verified at: 2026-08-01
certainty: established

subject: ActiveX
predicate: requires
object: ActiveXのデザイン時/実行時ライセンス
description: 古いActiveXコントロールではデザイン時ライセンスと実行時ライセンスが分かれていることがあり、開発機にライセンスファイルがないとフォームに貼れないことがある。
evidence: mfc-activex-controls-licensing-an-activex-control
verified at: 2026-08-01
certainty: context-dependent

subject: AxImp(ActiveX Control Importer)
predicate: requires
object: 型ライブラリ(TLB)
description: AximpはOCXが持つ型情報(型ライブラリ)をもとに、型付きのラッパーアセンブリを生成する。
evidence: aximp-exe-windows-forms-activex-control-importer
verified at: 2026-08-01
certainty: established

subject: AxImp(ActiveX Control Importer)
predicate: uses
object: AxHost
description: Aximpが生成するWindows Forms用ラッパーは、AxHostから派生したクラスとして作られる。
evidence: system.windows.forms.axhost
verified at: 2026-08-01
certainty: established

subject: AxHost
predicate: implements
object: ActiveX
description: AxHostはWindows Forms上でActiveXコントロールをホストするための基底クラスの実装を担う。
evidence: system.windows.forms.axhost
verified at: 2026-08-01
certainty: established

subject: COMアパートメントモデル(STA/MTA)
predicate: requires
object: メッセージループ
description: STA(single-threaded apartment)ではメッセージループが必要で、これは作法ではなく、隠しウィンドウ宛てのメッセージとして呼び出しを配達する仕組みそのものである。
evidence: single-threaded-apartments
verified at: 2026-08-01
certainty: context-dependent

subject: COMアパートメントモデル(STA/MTA)
predicate: requires
object: CoInitializeEx
description: COMを使う各スレッドはCoInitializeExで個別に初期化する必要がある。
evidence: initializing-the-com-library
verified at: 2026-08-01
certainty: established

subject: メッセージループ
predicate: prevents
object: STAスレッドのブロックによるデッドロック
description: メッセージループが動き続けることで別アパートメントからの呼び出しメッセージが取り出され続け、UIスレッドをブロックして取り出しを止めることによるデッドロックを避けられる。
evidence: single-threaded-apartments
verified at: 2026-08-01
certainty: established

subject: COMアパートメントモデル(STA/MTA)
predicate: requires
object: マーシャリング
description: STAのオブジェクトのインターフェイスポインターを別スレッドへそのままコピーしてはならず、アパートメントをまたぐにはマーシャリングする必要がある。
evidence: single-threaded-apartments
verified at: 2026-08-01
certainty: established

subject: Reg-Free COM(登録不要COM)
predicate: uses
object: アセンブリマニフェスト
description: Reg-Free COMは、レジストリの代わりにアセンブリマニフェストへCLSIDと実体ファイルの対応を書くことでアクティブ化情報を持たせる。
evidence: assembly-manifests
verified at: 2026-08-01
certainty: established

subject: Reg-Free COM(登録不要COM)
predicate: mitigates
object: COM/OCX/ActiveXの登録トラブル
description: activation contextにアクティブ化情報を持たせることで、レジストリ登録に伴う環境差の事故を減らせる。
evidence: creating-registration-free-com-objects
verified at: 2026-08-01
certainty: established

subject: COM LocalServer(別プロセスCOMサーバー)
predicate: requires
object: CLSID(Class ID)
description: LocalServer32はCLSIDサブキーの配下にあり、out-of-procサーバーのEXEパスを保持する。
evidence: classes-and-servers
verified at: 2026-08-01
certainty: established

subject: ProgID(Programmatic Identifier)
predicate: requires
object: CLSID(Class ID)
description: ProgIDから実際のCLSIDを引く対応が登録されていて初めて、ProgID経由でサーバーを見つけられる。
evidence: shared-registry-keys
verified at: 2026-08-01
certainty: established

subject: HKEY_LOCAL_MACHINE\Software\Classes
predicate: uses
object: WOW64レジストリリダイレクター
description: HKLM\SOFTWARE\Classes\CLSID配下はWOW64のリダイレクト対象で、32bit側の物理的な置き場所はClassesの下のWow6432Nodeになる。
evidence: shared-registry-keys
verified at: 2026-08-01
certainty: established

subject: CLSID(Class ID)
predicate: storedIn
object: HKEY_CLASSES_ROOT(HKCR)
description: CLSIDはHKEY_CLASSES_ROOT\CLSID\{CLSID}のようにレジストリのCLSIDキー配下に登録され、そのマージ元はHKLMとHKCUのClasses配下である。
evidence: shared-registry-keys
verified at: 2026-08-01
certainty: established

subject: ActiveX
predicate: requires
object: COMアパートメントモデル(STA/MTA)
description: 特にUI系のOCX/ActiveXはSTA前提であることが多く、STAスレッドをブロックするとコールバックの配達が止まって固まる。
evidence: single-threaded-apartments
verified at: 2026-08-01
certainty: context-dependent

subject: regsvr32
predicate: uses
object: .NET(5以降)のEnableComHosting/.comhost.dll
description: .NET 5+/6+/8+のCOM公開で生成された.comhost.dllも、規約通りregsvr32で登録する。
evidence: expose-components-to-com
verified at: 2026-08-01
certainty: established