COMオブジェクトは、OSによって管理される汎用オブジェクトのようです。オブジェクトは厳密なインターフェイスに従い、オブジェクトにクエリを実行して情報を決定できます。これはCOMオブジェクトとは何ですか?
COMオブジェクトは、OSによって管理される汎用オブジェクトのようです。オブジェクトは厳密なインターフェイスに従い、オブジェクトにクエリを実行して情報を決定できます。これはCOMオブジェクトとは何ですか?
回答:
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コンポーネントが実装する必要があるため、COMの基本です。これは、COM機構の2つの重要な側面を定義します。
QueryInterface
コードを呼び出して、既知のインターフェイスの実装を取得できます。COMでは、インターフェイスはGUID(インターフェイス識別子、IIDとも呼ばれます)によって参照されます。オブジェクトが複数のインターフェースを実装している場合、それがクライアントコードがそれらの各インターフェースへの参照を取得する方法です。必要に応じて、一種のキャスト演算子として機能します。AddRef()
そして、Release()
COMオブジェクトのメモリ管理メカニズムを実装します。その名前が示すように、最も一般的なモデルは参照カウントメカニズムであり、最後のクライアントがインスタンスへの参照を解放した後にインスタンスが破棄されます。すべてのCOMコンポーネントは、インストール時にシステムに登録されます。プログラマーが特定のコンポーネントを使用したい場合は、次のことを行う必要があります。
CoCreateInstance()
)。以下のレジストリを確認できますHKEY_CLASSES_ROOT\CLSID
。各GUIDには、(おそらく)COMコンポーネントまたはインターフェイスの識別子があり、そのキーの下のエントリは、システムにインスタンス化する方法を示します。COMの機械は非常に複雑です。たとえば、CでCOMコンポーネントを実装または使用するには、膨大な量の作業が必要ですが、Visual Basicなどの高級言語は、COMコンポーネントの実装と使用を容易にするために多くのことを行ってきました。ただし、メリットは非常に現実的です。たとえば、Visual Basicでアプリケーションを作成することは可能ですが、パフォーマンスが重要なアルゴリズムをCOMオブジェクトとしてCまたはC ++で実装することもできます。これは、VBコードから直接使用できます。システムは、メソッド呼び出し引数のマーシャリングを処理し、必要に応じてスレッド、プロセス、およびネットワーク接続を介してそれらを渡し、クライアントコードが通常のオブジェクトを使用しているような印象を与えるようにします。
Windowsの基本的な部分の多くはCOMに基づいています。たとえば、Windowsエクスプローラー(ファイルマネージャー)は基本的に空のシェルです。ツリー階層をナビゲートおよび表示するための一連のCOMインターフェイスを定義し、「マイコンピュータ」、ドライブ、フォルダ、およびファイルを実際に表示するすべてのコードは、これらのインターフェイスを実装するCOMコンポーネントのセットとして提供されます。
.NETの登場により、COMは徐々に時代遅れになりつつあります。
COMは、呼び出し元が別のベンダーのC ++コンパイラまたは(最終的には)まったく別の言語を使用している場合でも再利用できるバイナリを配布できるようにするために開発されたメカニズムです。
あなたはCOMの入門をしたい場合は、読みエッセンシャルCOMのことでドン・ボックス。