実装のための基礎知識

とりあえず時間がないので簡単に。
「Visual C++6.0によるCOMプログラミング」を流し読みした結果なので、間違っているかも^^;

ATL

Active Template Libraryの略
COMコンポーネント開発向けのフレームワーク
ATLを使うとIUnknowの変わりに、CComObjectRootExクラス、CComObjectクラスを使うことになる。
これらのクラスが、IUnknowを隠蔽している。
そのため、これらのクラスを利用すると、QueryInterface,AddRef,Releaseメソッドを実装する必要がなくなる。

CComObjectRootEx

コンポーネントのスレッドモデルにも対応する。
ATLではシングルスレッド、マルチスレッド、フリースレッドのいずれに対応するコンポーネントが作成できる。
InternalAddRef,InternalRelease,InternalQueryInterfaceメソッドを持つ。
これらメソッドは、CComObjectが実装する、AddRef,Release,QueryInterfaceメソッドから呼び出される。

CComObject

IUnknowインターフェイスを隠蔽するクラス。
テンプレートクラス。そのため、実際の実装は、テンプレートで指定されるクラスに依存する。
IUnknowインターフェイスの純粋仮想関数を実装しているクラス。
ただし、 CComObjectには、いくつか同系統のクラスが存在する。
また、CComObjectのインスタンスを生成する際には、CComObjectRootEx(CComObjectRoot)をCreateInstanceの引数として指定する。

CComPtr

ATLが提供するスマートポインタ。
AddRefとReleaseの呼び出しを隠蔽してくれる。

CComQIPtr

ATLが提供するスマートポインタ。
AddRefとReleaseの呼び出しに加え、QueryInterfaceの呼び出しも隠蔽してくれる。

CComBSTR

BSTRのラップクラス。
BSTRでは面倒な機能を提供する。
BSTRを生成すると、破棄する必要がある場合があるが、そういった動作も隠蔽してくれる。

CComVariant

VARIANTのラップクラス。
VARIANTでは面倒な機能を提供する。
VARIANTを生成すると、破棄する必要がある場合があるが、そういった動作も隠蔽してくれる。