COMは、C部分以外のC ++の非常に小さなサブセットを使用し、次のような「怖い」アイテムの多くを使用する必要はありません。
例外-これらは、正しく理解しないとC ++で実際に噛み付く可能性があります(従来のC / Win32コーディングに慣れている場合は、 RAIIイディオムに実際に同意する必要があります)。ただし、例外はCOMの一部ではありません。COMはすべてのエラー処理にリターンコードを使用します。必要に応じてCOMのリターンコードをC++例外に変換するラッパーとコンパイラ拡張機能がいくつかありますが、これはオプトインです。
クラス階層と継承-継承は、すべてのCOMインターフェイスがIUnknownから派生する(またはメソッドから開始する)という事実を除いて、実際にはCOM自体の一部でもありません。ただし、 COMを使用するために、複数の仮想継承について何も知る必要はありません。これのいくつかは、COMオブジェクトを自分で実装しているかどうかを知るのに非常に役立ちますが、それを使用するだけではありません。(たとえば、C ++の多重継承を使用することは、複数のインターフェイスを公開するCOMオブジェクトを実装するための非常に一般的な方法ですが、それが唯一の方法ではありません。)
テンプレート-繰り返しますが、COMの一部ではありませんが、いくつかのライブラリがあります-たとえば。MFCとATL-テンプレートを使用してCOMを非常に簡単に使用できるようにします。これは、CComPtrのようなスマートポインタクラスに特に当てはまります。CComPtrは、参照カウントを処理し、ハウスキーピングのようなものを詰め込むのではなく、コードが本当に興味深いことを行うことに集中できるようにします。
COMとC++の間の主なリンクは、Windows上のすべてのC ++コンパイラが、COMが必要とするものと正確に一致する方法でメモリ内にC++オブジェクトをレイアウトすることです。これにより、COMオブジェクトをC ++オブジェクトであるかのように使用できます。これにより、言語/コンパイラが非常に単純ですが冗長なものを処理するため、コードの冗長性が大幅に低下します。
したがって、Cで次のことを行う代わりに(vtableをステップスルーし、このパラメーターを明示的に渡します):
pUnk->lpVtbl->SomeMethod(pUnk, 42);
C++では次のことができます。
pUnk->SomeMethod(42);
本当に->lpVtblと入力する必要はなく、COM呼び出しを行うたびに、正しい'this'パラメーターを渡すようにしてください(切り取りと貼り付けの際は注意してください)。
私の提案は、良いCOMブックを見つけることです-COMの内部は良いものです-そしてあなたが快適なC++サブセットを使い始めるだけです。COMポインタを「生」で使用する方法を理解し、QI、AddRefなどを自分で使用する方法を理解したら、テンプレートを使用して簿記の一部を実行するヘルパーライブラリを試してみることができます。COMエラーをC++例外にマップするラッパーを使用することを決定することは、少し大きなジャンプです。最初に例外セーフなC ++コードを作成する必要があるため、最初にそれらのさまざまな問題を理解する必要があります。しかし、私は、純粋な好奇心以外に、戻ってプレーンCのCOMを使用する正当な理由を考えることはできません。