COMの設計が美しい理由の知識マップ(知識グラフ)
type: Dataset
description: 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(コンポーネントオブジェクトモデル)
type: Concept
definition: 公開インターフェース、レジストリ登録、Apartment Modelなどを土台にした、Windowsのバイナリ互換コンポーネントモデル。
alternative label: Component Object Model
uses: IUnknown
uses: QueryInterface
uses: COMの参照カウント(AddRef/Release)
uses: CLSID(Class ID)
uses: IID(インターフェース識別子)
uses: HRESULT
uses: IDL(インターフェース定義言語)
implements: COMのバイナリ互換性
implements: COMのバージョン共存

IUnknown
type: Concept
definition: COMのすべてのインターフェースが実装しなければならない基底インターフェースで、QueryInterface・AddRef・Releaseの3メソッドを持つ。
alternative label: IUnknown interface

QueryInterface
type: Concept
definition: COMオブジェクトが特定のIIDのインターフェースに対応しているかを、呼び出し側が実行時に安全に確認するための、IUnknownが持つメソッド。
alternative label: IUnknown::QueryInterface
broader: COM(コンポーネントオブジェクトモデル)

COMの参照カウント(AddRef/Release)
type: Concept
definition: AddRefで増え、Releaseで減って0になった時点でオブジェクト自身を破棄する、IUnknownが提供する寿命管理の仕組み。
alternative label: AddRef
alternative label: Release

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

IID(インターフェース識別子)
type: Concept
definition: COMインターフェース(契約)を一意に識別するGUID。契約の内容が変われば必ず新しいIIDになる。
alternative label: Interface ID
alternative label: IID
broader: COM(コンポーネントオブジェクトモデル)

HRESULT
type: Concept
definition: COMの呼び出し結果を表す32ビットの符号付き整数のエラーコード体系で、.NETの例外はHRESULTに対応付けられてCOM側へ伝わる。

COMのバイナリ互換性
type: Concept
definition: プログラミング言語やランタイムを問わず、一度ビルドしたCOMコンポーネントをそのまま再利用できる性質。
requires: IUnknown

COMのバージョン共存
type: Concept
definition: 既存インターフェースを変更せずに新しいインターフェースを追加し、QueryInterfaceで対応状況を実行時に確認することで後方互換を保つ設計。
requires: QueryInterface

In-proc COM(DLLサーバー)
type: Concept
definition: COMコンポーネントを呼び出し側と同じプロセスに読み込んで使う形態。
alternative label: DLLサーバー
requires: bitness一致要件
may cause: In-procのクラッシュ道連れ

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

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

In-procのクラッシュ道連れ
type: Concept
definition: In-proc COMコンポーネントがクラッシュすると、同じプロセスで動作しているホストアプリケーションも一緒に落ちてしまう現象。

Out-of-proc COMの切断エラー
type: Concept
definition: Out-of-proc COMのサーバープロセスがクラッシュ・終了したときに呼び出し側へ返る、RPC_E_DISCONNECTEDやRPC_S_SERVER_UNAVAILABLEといったエラー群。
alternative label: RPC_E_DISCONNECTED
alternative label: RPC_S_SERVER_UNAVAILABLE

Proxy/Stub
type: Concept
definition: マーシャリングを担当する一組の部品。呼び出す側に立つProxyと、呼ばれる側で受け取った呼び出しを本物のオブジェクトへ渡すStubからなる。

IDL(インターフェース定義言語)
type: Concept
definition: インターフェースという契約を先に記述し、そこから呼び出し側・実装側両方のヘッダーやコードを生成するための言語。
alternative label: Interface Definition Language
alternative label: MIDL

.NETのCOM相互運用(COM Interop)
type: Concept
definition: ComImport属性やRCW(Runtime Callable Wrapper)を介して.NETからCOMコンポーネントを呼び出す仕組み。HRESULTの失敗を例外に変換するなど、決まった規則で変換する。
alternative label: COM Interop
uses: QueryInterface
uses: HRESULT
uses: COMの参照カウント(AddRef/Release)

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

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

subject: COM(コンポーネントオブジェクトモデル)
predicate: uses
object: IUnknown
description: すべてのCOMインターフェースはIUnknownを継承し、QueryInterface・AddRef・Releaseの3メソッドを備える契約になっている。
evidence: iunknown
verified at: 2026-08-01
certainty: established

subject: COM(コンポーネントオブジェクトモデル)
predicate: uses
object: QueryInterface
description: 実行時に別のインターフェースへの対応を尋ねるQueryInterfaceが、実装を知らずに機能を確認する手段になっている。
evidence: rules-for-implementing-queryinterface
verified at: 2026-08-01
certainty: established

subject: COM(コンポーネントオブジェクトモデル)
predicate: uses
object: COMの参照カウント(AddRef/Release)
description: AddRefで増え、Releaseで減って0になると破棄される参照カウントで、COMオブジェクトの寿命を管理する。
evidence: managing-reference-counts
verified at: 2026-08-01
certainty: established

subject: COM(コンポーネントオブジェクトモデル)
predicate: uses
object: CLSID(Class ID)
description: コンポーネントの実装はCLSIDという世界で一意なGUIDで識別される。
evidence: com-class-objects-and-clsids
verified at: 2026-08-01
certainty: established

subject: COM(コンポーネントオブジェクトモデル)
predicate: uses
object: IID(インターフェース識別子)
description: インターフェースの契約もIIDというGUIDで一意に識別され、名前の衝突を防ぐ。
evidence: com-interfaces
verified at: 2026-08-01
certainty: established

subject: COM(コンポーネントオブジェクトモデル)
predicate: uses
object: HRESULT
description: COMメソッドは例外ではなく整数のHRESULTで成否を返し、これが言語をまたいだ解釈を可能にする。
evidence: structure-of-com-error-codes
verified at: 2026-08-01
certainty: established

subject: COM(コンポーネントオブジェクトモデル)
predicate: implements
object: COMのバイナリ互換性
description: 仮想関数テーブルの並び順だけを規約にすることで、言語やコンパイラを問わない再利用を実現している。
evidence: component-object-model--com--portal
verified at: 2026-08-01
certainty: established

subject: COMのバイナリ互換性
predicate: requires
object: IUnknown
description: 呼び出しの並び順がバイナリレベルで決まるのは、すべてのインターフェースがIUnknownを継承する規約があるからである。
evidence: iunknown
verified at: 2026-08-01
certainty: established

subject: COM(コンポーネントオブジェクトモデル)
predicate: implements
object: COMのバージョン共存
description: 既存インターフェースを変えずに新しいインターフェースを追加していく設計が、後方互換を保ったバージョン共存を実現する。
evidence: rules-for-implementing-queryinterface
verified at: 2026-08-01
certainty: established

subject: COMのバージョン共存
predicate: requires
object: QueryInterface
description: 新しい版の契約に対応しているかどうかを、QueryInterfaceで実行時に確認する。
evidence: rules-for-implementing-queryinterface
verified at: 2026-08-01
certainty: established

subject: COM(コンポーネントオブジェクトモデル)
predicate: uses
object: In-proc COM(DLLサーバー)
description: コンポーネントをそう登録した場合、呼び出し側と同じプロセスにDLLとして読み込むIn-proc(DLLサーバー)という配置形態を持つ。
evidence: inprocserver32
verified at: 2026-08-01
certainty: context-dependent

subject: COM(コンポーネントオブジェクトモデル)
predicate: uses
object: COM LocalServer(別プロセスCOMサーバー)
description: コンポーネントをそう登録した場合、別プロセスのEXEとして起動するOut-of-proc(EXEサーバー、LocalServer)という配置形態も持つ。
evidence: localserver32
verified at: 2026-08-01
certainty: context-dependent

subject: In-proc COM(DLLサーバー)
predicate: requires
object: bitness一致要件
description: In-procは呼び出し側プロセスとビット数(32bit/64bit)が一致していないと読み込めない。
evidence: running-32-bit-applications
verified at: 2026-08-01
certainty: established

subject: In-proc COM(DLLサーバー)
predicate: mayCause
object: In-procのクラッシュ道連れ
description: 同じプロセスで動くIn-procコンポーネントがクラッシュすると、呼び出し側のホストプロセスも道連れで落ちる。
evidence: inprocserver32
verified at: 2026-08-01
certainty: established

subject: COM LocalServer(別プロセスCOMサーバー)
predicate: prevents
object: In-procのクラッシュ道連れ
description: 別プロセスで動くOut-of-procなら、サーバー側がクラッシュしても呼び出し側は生き残る。
evidence: localserver32
verified at: 2026-08-01
certainty: established

subject: COM LocalServer(別プロセスCOMサーバー)
predicate: mayCause
object: Out-of-proc COMの切断エラー
description: 別プロセスであることは相手がいつでも消えうることも意味し、RPC_E_DISCONNECTEDやRPC_S_SERVER_UNAVAILABLEといったエラーが返ることがある。
evidence: component-object-model--com--portal
verified at: 2026-08-01
certainty: context-dependent

subject: COM(コンポーネントオブジェクトモデル)
predicate: uses
object: Proxy/Stub
description: 別プロセスや別マシンの呼び出しでも、Proxy/Stubが引数の詰め直し(マーシャリング)とプロセス間通信を隠し、呼び出し側のコードの見た目を変えない。
evidence: proxies-and-stubs
verified at: 2026-08-01
certainty: context-dependent

subject: COM(コンポーネントオブジェクトモデル)
predicate: uses
object: IDL(インターフェース定義言語)
description: インターフェースという契約は通常IDLで先に定義し、そこから各言語向けのヘッダーを生成する。
evidence: midl-language-reference
verified at: 2026-08-01
certainty: established

subject: .NETのCOM相互運用(COM Interop)
predicate: uses
object: ProgID(Programmatic Identifier)
description: ProgIDを使って解決する場合、Type.GetTypeFromProgIDのように、人が読めるProgIDから対応するCLSIDのコンポーネントを解決して呼び出せる。
evidence: system.type.gettypefromprogid
verified at: 2026-08-01
certainty: context-dependent

subject: .NETのCOM相互運用(COM Interop)
predicate: uses
object: QueryInterface
description: C#でのインターフェースへのキャストは、内部的にQueryInterfaceの呼び出しに相当する。
evidence: rules-for-implementing-queryinterface
verified at: 2026-08-01
certainty: established

subject: .NETのCOM相互運用(COM Interop)
predicate: uses
object: HRESULT
description: 失敗したHRESULTは.NET側で例外に変換されるという決まった規則で扱われる。
evidence: how-to-map-hresults-and-exceptions
verified at: 2026-08-01
certainty: established

subject: .NETのCOM相互運用(COM Interop)
predicate: uses
object: COMの参照カウント(AddRef/Release)
description: AddRef/Releaseは.NET側では見えなくなるが、RCWという薄いラッパーが代わりに呼び出している。
evidence: native-interop
verified at: 2026-08-01
certainty: established

subject: ActiveX
predicate: requires
object: COM(コンポーネントオブジェクトモデル)
description: ActiveXは、実務ではCOMベースのコントロールやその周辺資産をまとめて指す言葉として使われる。
evidence: component-object-model--com--portal
verified at: 2026-08-01
certainty: established