知識マップ: 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による契約の事前定義が、この仕組み全体を言語やプロセスの境界から独立させています。

COMの設計が美しい理由の知識マップCOMがIUnknownによる参照カウントとQueryInterface、CLSID・IIDによる識別を土台に、バイナリ互換性・インターフェース分離・バージョン共存・プロセス境界を越えた再利用という強みを実現し、In-procとOut-of-procの配置形態やHRESULT、.NETとの相互運用へつながる関係を示す図。利用する利用する利用する利用する利用する利用する実装を担う前提とする実装を担う前提とする利用する利用する前提とする原因になり得る防止する原因になり得る利用する利用する利用する利用する利用する利用する前提とするCOM(コンポーネントオブジェクトモデル)IUnknownQueryInterfaceCOMの参照カウント(AddRef/Release)CLSID(Class ID)IID(インターフェース識別子)HRESULTCOMのバイナリ互換性COMのバージョン共存In-proc COM(DLLサーバー)COM LocalServer(別プロセスCOMサーバー)bitness一致要件In-procのクラッシュ道連れOut-of-proc COMの切断エラーProxy/StubIDL(インターフェース定義言語).NETのCOM相互運用(COM Interop)ProgID(Programmatic Identifier)ActiveX

概念間の関係(全23件)

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

主要概念の定義

COM(コンポーネントオブジェクトモデル)
公開インターフェース、レジストリ登録、Apartment Modelなどを土台にした、Windowsのバイナリ互換コンポーネントモデル。
COMのバイナリ互換性
プログラミング言語やランタイムを問わず、一度ビルドしたCOMコンポーネントをそのまま再利用できる性質。
COMのバージョン共存
既存インターフェースを変更せずに新しいインターフェースを追加し、QueryInterfaceで対応状況を実行時に確認することで後方互換を保つ設計。
In-proc COM(DLLサーバー)
COMコンポーネントを呼び出し側と同じプロセスに読み込んで使う形態。
COM LocalServer(別プロセスCOMサーバー)
COMサーバーをEXEとして別プロセスで動かす形態。bitnessの壁を越えたり、クラッシュを隔離したりできる。レジストリのCLSID配下のLocalServer32キーにEXEパスを登録する。
.NETのCOM相互運用(COM Interop)
ComImport属性やRCW(Runtime Callable Wrapper)を介して.NETからCOMコンポーネントを呼び出す仕組み。HRESULTの失敗を例外に変換するなど、決まった規則で変換する。
ActiveX
実務ではCOMベースのコントロールやその周辺資産をまとめて指す言葉として使われる技術群。特に.ocx形式のUIコントロールやIE/コンテナへ埋め込む部品を含むことが多い。

機械可読データ

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