知識マップ: 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が呼び出しを配達する仕組みそのものであり、これを止めるとデッドロックします。
flowchart LR
accTitle: COM/ActiveX登録トラブルの知識マップ
accDescr: COM・OCX・ActiveXの登録トラブルが、Visual Studio 2022の64bit化・WOW64レジストリリダイレクター・regsvr32やRegasmといった登録手段の使い分け・HKCUとHKLMの登録スコープ・STAのメッセージループとどう関係するかを示す図
com_registration_pitfalls["COM/OCX/ActiveXの登録トラブル"]
visual_studio_2022["Visual Studio 2022"]
wow64_registry_redirector["WOW64レジストリリダイレクター"]
activex["ActiveX"]
ocx["OCX"]
bitness_match_requirement["bitness一致要件"]
com["COM(コンポーネントオブジェクトモデル)"]
hkcu_classes["HKEY_CURRENT_USER\Software\Classes"]
clsid["CLSID(Class ID)"]
wow6432node["WOW6432Node"]
regsvr32["regsvr32"]
in_proc_com["In-proc COM(DLLサーバー)"]
regasm["Regasm.exe"]
dotnet_framework[".NET Framework"]
dotnet_comhost[".NET(5以降)のEnableComHosting/.comhost.dll"]
dotnet[".NET(Core以降)"]
file_system_redirector["WOW64ファイルシステムリダイレクター"]
admin_rights["管理者権限"]
class_not_registered_error["0x80040154(Class not registered)"]
per_user_registration["per-user登録"]
hkcr["HKEY_CLASSES_ROOT(HKCR)"]
hklm_classes["HKEY_LOCAL_MACHINE\Software\Classes"]
per_machine_registration["per-machine登録"]
activex_license["ActiveXのデザイン時/実行時ライセンス"]
aximp["AxImp(ActiveX Control Importer)"]
type_library["型ライブラリ(TLB)"]
axhost["AxHost"]
com_apartment_model["COMアパートメントモデル(STA/MTA)"]
message_loop["メッセージループ"]
coinitializeex["CoInitializeEx"]
sta_blocking_deadlock["STAスレッドのブロックによるデッドロック"]
com_marshaling["マーシャリング"]
reg_free_com["Reg-Free COM(登録不要COM)"]
assembly_manifest["アセンブリマニフェスト"]
com_localserver["COM LocalServer(別プロセスCOMサーバー)"]
progid["ProgID(Programmatic Identifier)"]
com_registration_pitfalls -->|"利用する"| wow64_registry_redirector
com_registration_pitfalls -->|"利用する"| visual_studio_2022
visual_studio_2022 -.->|"両立しない"| activex
ocx -->|"前提とする"| bitness_match_requirement
ocx -->|"実装を担う"| activex
com -->|"利用する"| hkcu_classes
clsid -.->|"に保存される"| wow6432node
regsvr32 -->|"利用する"| in_proc_com
regasm -->|"推奨される対応"| dotnet_framework
regsvr32 -->|"用いるのは非推奨"| dotnet_framework
dotnet_comhost -->|"推奨される対応"| dotnet
regsvr32 -->|"利用する"| file_system_redirector
regsvr32 -.->|"前提とする"| admin_rights
wow64_registry_redirector -.->|"原因になり得る"| class_not_registered_error
per_user_registration -.->|"原因になり得る"| class_not_registered_error
hkcr -->|"内容を継承する"| hklm_classes
hkcr -->|"内容を継承する"| hkcu_classes
per_machine_registration -->|"前提とする"| admin_rights
activex -.->|"前提とする"| activex_license
aximp -->|"前提とする"| type_library
aximp -->|"利用する"| axhost
axhost -->|"実装を担う"| activex
com_apartment_model -.->|"前提とする"| message_loop
com_apartment_model -->|"前提とする"| coinitializeex
message_loop -->|"防止する"| sta_blocking_deadlock
com_apartment_model -->|"前提とする"| com_marshaling
reg_free_com -->|"利用する"| assembly_manifest
reg_free_com -->|"軽減する"| com_registration_pitfalls
com_localserver -->|"前提とする"| clsid
progid -->|"前提とする"| clsid
hklm_classes -->|"利用する"| wow64_registry_redirector
clsid -->|"に保存される"| hkcr
activex -.->|"前提とする"| com_apartment_model
regsvr32 -->|"利用する"| dotnet_comhost
概念間の関係(全34件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- COM/OCX/ActiveXの登録トラブルはWOW64レジストリリダイレクターを利用します。
- COM/OCX/ActiveXの登録トラブルはVisual Studio 2022を利用します。
- Visual Studio 2022はActiveXと両立しません。
- OCXはbitness一致要件を前提とします。
- OCXはActiveXの実装を担います。
- COM(コンポーネントオブジェクトモデル)はHKEY_CURRENT_USER\Software\Classesを利用します。
- CLSID(Class ID)はWOW6432Nodeに保存されます。
- regsvr32はIn-proc COM(DLLサーバー)を利用します。
- Regasm.exeは.NET Frameworkに対する本記事の推奨です。
- regsvr32を.NET Frameworkに用いることは推奨されません。
- .NET(5以降)のEnableComHosting/.comhost.dllは.NET(Core以降)に対する本記事の推奨です。
- regsvr32はWOW64ファイルシステムリダイレクターを利用します。
- regsvr32は管理者権限を前提とします。
- WOW64レジストリリダイレクターは0x80040154(Class not registered)の原因になることがあります。
- per-user登録は0x80040154(Class not registered)の原因になることがあります。
- HKEY_CLASSES_ROOT(HKCR)はHKEY_LOCAL_MACHINE\Software\Classesの内容を継承して表示します。
- HKEY_CLASSES_ROOT(HKCR)はHKEY_CURRENT_USER\Software\Classesの内容を継承して表示します。
- per-machine登録は管理者権限を前提とします。
- ActiveXはActiveXのデザイン時/実行時ライセンスを前提とします。
- AxImp(ActiveX Control Importer)は型ライブラリ(TLB)を前提とします。
- AxImp(ActiveX Control Importer)はAxHostを利用します。
- AxHostはActiveXの実装を担います。
- COMアパートメントモデル(STA/MTA)はメッセージループを前提とします。
- COMアパートメントモデル(STA/MTA)はCoInitializeExを前提とします。
- メッセージループはSTAスレッドのブロックによるデッドロックを防ぎます。
- COMアパートメントモデル(STA/MTA)はマーシャリングを前提とします。
- Reg-Free COM(登録不要COM)はアセンブリマニフェストを利用します。
- Reg-Free COM(登録不要COM)はCOM/OCX/ActiveXの登録トラブルを軽減します。
- COM LocalServer(別プロセスCOMサーバー)はCLSID(Class ID)を前提とします。
- ProgID(Programmatic Identifier)はCLSID(Class ID)を前提とします。
- HKEY_LOCAL_MACHINE\Software\ClassesはWOW64レジストリリダイレクターを利用します。
- CLSID(Class ID)はHKEY_CLASSES_ROOT(HKCR)に保存されます。
- ActiveXはCOMアパートメントモデル(STA/MTA)を前提とします。
- regsvr32は.NET(5以降)のEnableComHosting/.comhost.dllを利用します。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。