知識マップ: COM とは何か - Windows COM の設計が今でも美しい理由
記事「COM とは何か - Windows COM の設計が今でも美しい理由」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
COMはWindows上でコンポーネント同士がやり取りするためのバイナリ契約で、すべてのインターフェースが継承するIUnknownがQueryInterfaceによる機能確認とAddRef/Releaseによる参照カウント管理を提供します。CLSIDとIIDというGUIDでコンポーネントとインターフェースを一意に識別することで名前の衝突を避け、既存インターフェースを変えずに新しいインターフェースを追加してQueryInterfaceで確認する設計がバージョン共存を実現します。呼び出し側と同じプロセスに読み込むIn-proc(DLLサーバー)はビット数の一致が必須で相手のクラッシュに道連れになりますが、別プロセスで動くOut-of-proc(LocalServer)はその制約から自由な代わりに、相手が消えたときのRPC_E_DISCONNECTEDのような切断エラーへの備えが必要になります。HRESULTという戻り値による成否表現とProxy/Stub、IDLによる契約の事前定義が、この仕組み全体を言語やプロセスの境界から独立させています。
flowchart LR
accTitle: COMの設計が美しい理由の知識マップ
accDescr: COMがIUnknownによる参照カウントとQueryInterface、CLSID・IIDによる識別を土台に、バイナリ互換性・インターフェース分離・バージョン共存・プロセス境界を越えた再利用という強みを実現し、In-procとOut-of-procの配置形態やHRESULT、.NETとの相互運用へつながる関係を示す図。
com["COM(コンポーネントオブジェクトモデル)"]
iunknown["IUnknown"]
queryinterface["QueryInterface"]
com_reference_counting["COMの参照カウント(AddRef/Release)"]
clsid["CLSID(Class ID)"]
iid["IID(インターフェース識別子)"]
hresult["HRESULT"]
com_binary_compatibility["COMのバイナリ互換性"]
com_interface_versioning["COMのバージョン共存"]
in_proc_com["In-proc COM(DLLサーバー)"]
com_localserver["COM LocalServer(別プロセスCOMサーバー)"]
bitness_match_requirement["bitness一致要件"]
in_proc_crash_propagation["In-procのクラッシュ道連れ"]
out_of_proc_com_disconnection_error["Out-of-proc COMの切断エラー"]
proxy_stub["Proxy/Stub"]
idl["IDL(インターフェース定義言語)"]
dotnet_com_interop[".NETのCOM相互運用(COM Interop)"]
progid["ProgID(Programmatic Identifier)"]
activex["ActiveX"]
com -->|"利用する"| iunknown
com -->|"利用する"| queryinterface
com -->|"利用する"| com_reference_counting
com -->|"利用する"| clsid
com -->|"利用する"| iid
com -->|"利用する"| hresult
com -->|"実装を担う"| com_binary_compatibility
com_binary_compatibility -->|"前提とする"| iunknown
com -->|"実装を担う"| com_interface_versioning
com_interface_versioning -->|"前提とする"| queryinterface
com -.->|"利用する"| in_proc_com
com -.->|"利用する"| com_localserver
in_proc_com -->|"前提とする"| bitness_match_requirement
in_proc_com -->|"原因になり得る"| in_proc_crash_propagation
com_localserver -->|"防止する"| in_proc_crash_propagation
com_localserver -.->|"原因になり得る"| out_of_proc_com_disconnection_error
com -.->|"利用する"| proxy_stub
com -->|"利用する"| idl
dotnet_com_interop -.->|"利用する"| progid
dotnet_com_interop -->|"利用する"| queryinterface
dotnet_com_interop -->|"利用する"| hresult
dotnet_com_interop -->|"利用する"| com_reference_counting
activex -->|"前提とする"| com
概念間の関係(全23件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- COM(コンポーネントオブジェクトモデル)はIUnknownを利用します。
- COM(コンポーネントオブジェクトモデル)はQueryInterfaceを利用します。
- COM(コンポーネントオブジェクトモデル)はCOMの参照カウント(AddRef/Release)を利用します。
- COM(コンポーネントオブジェクトモデル)はCLSID(Class ID)を利用します。
- COM(コンポーネントオブジェクトモデル)はIID(インターフェース識別子)を利用します。
- COM(コンポーネントオブジェクトモデル)はHRESULTを利用します。
- COM(コンポーネントオブジェクトモデル)はCOMのバイナリ互換性の実装を担います。
- COMのバイナリ互換性はIUnknownを前提とします。
- COM(コンポーネントオブジェクトモデル)はCOMのバージョン共存の実装を担います。
- COMのバージョン共存はQueryInterfaceを前提とします。
- COM(コンポーネントオブジェクトモデル)はIn-proc COM(DLLサーバー)を利用します。
- COM(コンポーネントオブジェクトモデル)はCOM LocalServer(別プロセスCOMサーバー)を利用します。
- In-proc COM(DLLサーバー)はbitness一致要件を前提とします。
- In-proc COM(DLLサーバー)はIn-procのクラッシュ道連れの原因になることがあります。
- COM LocalServer(別プロセスCOMサーバー)はIn-procのクラッシュ道連れを防ぎます。
- COM LocalServer(別プロセスCOMサーバー)はOut-of-proc COMの切断エラーの原因になることがあります。
- COM(コンポーネントオブジェクトモデル)はProxy/Stubを利用します。
- COM(コンポーネントオブジェクトモデル)はIDL(インターフェース定義言語)を利用します。
- .NETのCOM相互運用(COM Interop)はProgID(Programmatic Identifier)を利用します。
- .NETのCOM相互運用(COM Interop)はQueryInterfaceを利用します。
- .NETのCOM相互運用(COM Interop)はHRESULTを利用します。
- .NETのCOM相互運用(COM Interop)はCOMの参照カウント(AddRef/Release)を利用します。
- ActiveXはCOM(コンポーネントオブジェクトモデル)を前提とします。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。