知識マップ: COM/OCX/ActiveX開発でハマる登録とbitnessの罠

記事「COM/OCX/ActiveX開発でハマる登録とbitnessの罠」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

COM・OCX・ActiveXのトラブルは、コードの不具合よりbitness・登録手段・登録スコープ・権限の不一致で起きがちです。Visual Studio 2022はdevenv.exeが64bitプロセスのためx86固定のActiveXをデザイン時に直接ロードできず、regsvr32はネイティブのin-proc COMサーバー向けで、.NET Frameworkの登録にはRegasm.exeを使い分ける必要があります。HKEY_CLASSES_ROOTはHKLMとHKCUのmerged viewで、CLSIDサブキーはWow6432Nodeを介して32bit/64bitで別になるため、別viewやper-userにしか登録されていないだけでもClass not registeredになります。STAではメッセージループとCoInitializeExが呼び出しを配達する仕組みそのものであり、これを止めるとデッドロックします。

COM/ActiveX登録トラブルの知識マップCOM・OCX・ActiveXの登録トラブルが、Visual Studio 2022の64bit化・WOW64レジストリリダイレクター・regsvr32やRegasmといった登録手段の使い分け・HKCUとHKLMの登録スコープ・STAのメッセージループとどう関係するかを示す図利用する利用する両立しない前提とする実装を担う利用するに保存される利用する推奨される対応用いるのは非推奨推奨される対応利用する前提とする原因になり得る原因になり得る内容を継承する内容を継承する前提とする前提とする前提とする利用する実装を担う前提とする前提とする防止する前提とする利用する軽減する前提とする前提とする利用するに保存される前提とする利用するCOM/OCX/ActiveXの登録トラブルVisual Studio 2022WOW64レジストリリダイレクターActiveXOCXbitness一致要件COM(コンポーネントオブジェクトモデル)HKEY_CURRENT_USER\Software\ClassesCLSID(Class ID)WOW6432Noderegsvr32In-proc COM(DLLサーバー)Regasm.exe.NET Framework.NET(5以降)のEnableComHosting/.comhost.dll.NET(Core以降)WOW64ファイルシステムリダイレクター管理者権限0x80040154(Class not registered)per-user登録HKEY_CLASSES_ROOT(HKCR)HKEY_LOCAL_MACHINE\Software\Classesper-machine登録ActiveXのデザイン時/実行時ライセンスAxImp(ActiveX Control Importer)型ライブラリ(TLB)AxHostCOMアパートメントモデル(STA/MTA)メッセージループCoInitializeExSTAスレッドのブロックによるデッドロックマーシャリングReg-Free COM(登録不要COM)アセンブリマニフェストCOM LocalServer(別プロセスCOMサーバー)ProgID(Programmatic Identifier)

概念間の関係(全34件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

COM/OCX/ActiveXの登録トラブル
bitness・登録先・ホスト・権限の不一致によって起きる、COMやOCX/ActiveXの典型的な登録トラブル群。
Visual Studio 2022
devenv.exeが64bit onlyになったバージョンのVisual Studio。
WOW64レジストリリダイレクター
64bit Windows上で32bitアプリと64bitアプリに別々のレジストリviewを見せる仕組み。HKLM\SOFTWARE\Classes直下は共有される一方、CLSIDサブキー配下は32bit側と64bit側で別になる。
OCX
ActiveXコントロールの実体を持つ.ocx形式のファイル。in-procの形態でホストプロセスに読み込まれる。
COM(コンポーネントオブジェクトモデル)
公開インターフェース、レジストリ登録、Apartment Modelなどを土台にした、Windowsのバイナリ互換コンポーネントモデル。
CLSID(Class ID)
COMコンポーネントの実装(クラス)を一意に指すGUID。レジストリ上の登録の鍵になる識別子。
regsvr32
DLLやOCXなどのCOMコンポーネントをレジストリへ登録・登録解除するコマンドラインツール。
Regasm.exe
.NET FrameworkのアセンブリをCOMへ登録するための登録ツール。
.NET(5以降)のEnableComHosting/.comhost.dll
.NET 5以降でCOM公開を行うための仕組み。ビルド時に.comhost.dllを生成しregsvr32で登録する(既定でin-procのみ)。
per-user登録
そのユーザーのアカウントだけで有効な、開発機での手動登録などに使われるCOM登録のスコープ。
HKEY_CLASSES_ROOT(HKCR)
HKLM\Software\ClassesとHKCU\Software\Classesのmerged view。
per-machine登録
そのマシンの全ユーザーで有効な、インストーラーで行うべきCOM登録のスコープ。
ActiveX
実務ではCOMベースのコントロールやその周辺資産をまとめて指す言葉として使われる技術群。特に.ocx形式のUIコントロールやIE/コンテナへ埋め込む部品を含むことが多い。
AxImp(ActiveX Control Importer)
.NET Framework付属のツールで、OCXからCOM型のランタイム呼び出し可能ラッパーと、AxHost派生のWindows Forms用ラッパーアセンブリを生成する。生成ファイル名はProgIDから決まる。
AxHost
Windows Forms上でActiveXコントロールをホストするための基底クラス。
COMアパートメントモデル(STA/MTA)
どのスレッドからCOMコンポーネントを呼んでよいかを決める、COMのスレッドモデルの約束。
メッセージループ
スレッドがGetMessage/DispatchMessageなどで自分のウィンドウ宛てのメッセージを順に取り出し処理し続ける仕組み。入力・描画・イベント処理を担うと同時に、STAが持つOleMainThreadWndClassという隠しウィンドウ宛てに届く、別アパートメントからの呼び出しメッセージもここでディスパッチされる。
Reg-Free COM(登録不要COM)
レジストリ登録なしに、アプリ側のマニフェストに書いたCLSIDやProgIDなどの情報でCOMコンポーネントを解決する仕組み。
COM LocalServer(別プロセスCOMサーバー)
COMサーバーをEXEとして別プロセスで動かす形態。bitnessの壁を越えたり、クラッシュを隔離したりできる。レジストリのCLSID配下のLocalServer32キーにEXEパスを登録する。
ProgID(Programmatic Identifier)
CLSIDに付けた、人が読める文字列の名前。`Excel.Application`のような形でCLSIDに対応付けられる。
HKEY_LOCAL_MACHINE\Software\Classes
そのマシンの全ユーザーに見える、コンピューター全体のCOMクラス登録の場所。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。