COM

Last-modified: 2012-06-28 (木) 08:34:48

COM/Essential COM

COM(Component Object Model)

  • バイナリ標準であり,特定の言語に依存しない
  • COMコンポーネント:インタフェースの実装。実装言語上の「クラス」で表現される?
  • COMオブジェクト:COMコンポーネントをインスタンス化したもの。
  • COMインタフェース:COMオブジェクトを操作するための,一連の関数セット。C++では「純粋仮想クラス」で表現される。
  • COMインタフェースは「自身が持つ関数の実体へのポインタの配列(関数ポインタの配列)」としてメモリ中に配置されねばならない?
  • 特定言語への依存性をなくしつつ,インタフェースと実装の分離を図るために,インタフェースを定義するための言語(COM IDL/MIDL)を別に定義し,実装用言語と分離した。
    http://en.wikipedia.org/wiki/Microsoft_Interface_Definition_Language
  • Windowsが提供する機能(システムコール?)の多くが,COMインタフェースとして提供される。
  • COMコンポーネントがDLLで提供される場合,DLLがクライアントプロセスのメモリ内にロードされ,そこにCOMオブジェクトが生成される。
    一方,COMコンポーネントがEXEで提供される場合,EXEがクライアントプロセスとは別プロセスとして起動される。

アパート

  • 各COMオブジェクトの実装の,マルチスレッド対応の度合いをクライアントから隠すための仕組み(?)
  • COMオブジェクトはいずれか1つのアパートに属する
  • 1つのアパートを複数のオブジェクトで共有できる
  • COMを使うプロセスは1つ以上のアパートを持つ
  • 1つのアパートはどれか1つのプロセスにしか属さない
  • 同じアパートで同時に実行されるスレッドは1つだけ
  • アパートにはMTA(マルチスレッドアパート)とSTA(シングルスレッドアパート)がある。
    • MTAでは複数スレッドを同時実行できるが,STAでは単一スレッドしか実行できない。
  • MTAは1プロセスに高々1つしかなく,STAは多数ある場合がある
  • CoInitialize(Ex)は,それを実行したスレッドをアパートに入れる(COMオブジェクトを使えるようにする)。
  • COMクライアントとCOMサーバの双方に,自身のスレッディングモデルを指定する方法がある。

http://atata.sakura.ne.jp/
http://eternalwindows.jp/index.html#com
http://ja.wikipedia.org/wiki/Component_Object_Model