実装のための基礎知識
とりあえず時間がないので簡単に。
「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を生成すると、破棄する必要がある場合があるが、そういった動作も隠蔽してくれる。