web-dev-qa-db-ja.com

一言で言えばCOM(コンポーネントオブジェクトモデル)とは何ですか?

COMオブジェクトは、OSによって管理される汎用オブジェクトであるようです。オブジェクトは厳密なインターフェースに従い、オブジェクトを照会して情報を判別できます。これはCOMオブジェクトとは何ですか?

73
RBehelit

[〜#〜] com [〜#〜] は、コンポーネントを実装したプログラマーとプログラマーが使用する言語に関係なく、オブジェクト(またはコンポーネント)の再利用を可能にするメカニズムです。誰がそれを使用し、コンポーネントがクライアントのプログラムに実装されているか、マシン(またはネットワーク)のどこに実装されているかに関係なく。

大まかに言って、各COMコンポーネントは1つ以上のインターフェイスの実装を提供します。これらのインターフェイスは、 インターフェイス定義言語(IDL) を使用して、言語に依存しない方法で定義されます。例として、COMの基本的なインターフェイスの1つである IUnknown は、次のように定義されます。

_interface IUnknown
{
   virtual HRESULT QueryInterface(REFIID riid, void **ppvObject) = 0;
   virtual ULONG AddRef(void) = 0;
   virtual ULONG Release(void) = 0;
};
_

各COMコンポーネントmustが実装するため、この小さなインターフェイスはCOMの基本です。 COM機械の2つの重要な側面を定義します。

  • QueryInterfaceを使用すると、呼び出し元のコードが既知のインターフェイスの実装を取得できます。 COMでは、インターフェイスはGUID(インターフェイス識別子、IIDとも呼ばれます)によって参照されます。オブジェクトが複数のインターフェイスを実装する場合、クライアントコードはこれらの各インターフェイスへの参照を取得します。必要に応じて、一種のキャスト演算子として機能します。
  • AddRef()およびRelease()は、COMオブジェクトのメモリ管理メカニズムを実装します。その名前が示すように、最も一般的なモデルは参照カウントメカニズムであり、最後のクライアントがその参照を解放した後にインスタンスが破棄されます。

すべてのCOMコンポーネントは、インストール時にシステムに登録されます。プログラマーが特定のコンポーネントを使用する場合、次のことが必要です。

  • コンポーネントが到達可能な場所にインストールされていることを確認してください。ほとんどの場合、実行中のアプリケーションのシステム上にありますが、COM +では、リモートコンピューター上にコンポーネントを存在させることもできます。
  • 指定されたコンポーネントのGUID。このGUIDを使用して、クライアントはシステムにコンポーネントのインスタンス化を要求できます(Cでは、これを行う関数はCoCreateInstance()と呼ばれます) )。_HKEY_CLASSES_ROOT\CLSID_の下のレジストリを見ることができます:各GUID=には、おそらくCOMコンポーネントまたはインターフェイスの識別子があり、そのキーの下のエントリはシステムのインスタンス化方法。

COM機械は非常に複雑です。たとえば、CでCOMコンポーネントを実装または使用するには多大な労力が必要ですが、Visual Basicなどの高レベル言語はCOMコンポーネントの実装と使用を容易にするために多くのことを行っています。ただし、利点は非常に現実的です。たとえば、Visual Basicでアプリケーションを記述できますが、C = C++のパフォーマンスが重要なアルゴリズムをCOMオブジェクトとして実装することもできます。これはVBコードから直接使用できますシステムは、marshallingメソッド呼び出し引数を処理し、必要に応じてスレッド、プロセス、およびネットワーク接続を介して渡し、クライアントコードが通常のオブジェクトを使用します。

Windowsの多くの基本的な部分はCOMに基づいています。たとえば、Windowsエクスプローラー(ファイルマネージャー)は、基本的に空のシェルです。ツリー階層をナビゲートして表示するための一連のCOMインターフェイスを定義します。実際に「マイコンピュータ」、ドライブ、フォルダ、およびファイルを表示するすべてのコードは、これらのインターフェイスを実装するCOMコンポーネントのセットです。

.NETの登場により、COMは徐々に時代遅れになりつつあります。

88
Carl Seleborg

COMは、呼び出し元が別のベンダーのC++コンパイラまたは(最終的に)まったく異なる言語を使用している場合でも再利用できるバイナリを配布できるように開発されたメカニズムです。

COMの概要を知りたい場合は、 Essential COM by Don Box を読んでください。

30
McDowell