クラスファクトリの実装 ~ 作ってわかる COM の基礎
クラスファクトリは、COM オブジェクトを生成するためのクラスです。このインスタンスはクラスオブジェクトなどといいます。
COM オブジェクトを生成するときには通常、CoCreateInstance という COM API を利用します。 C++ のオブジェクトを new で生成するのと異なり、CoCreateInstance という API を途中に挟んでインスタンスを生成することによって、 COM のシステムがそのインスタンスを生成する場所を変えることができるのです。例えば、CoCreateInstance で COM オブジェクトを生成したときに、 その実体が同じプロセス内にある場合もあれば、他のプロセスにある場合もあるのです。
CoCreateInstance を介してオブジェクトを生成するためには、あるお約束事が必要になりますが(オブジェクトの生成方法がてんでばらばらなら、 統一された方法は実装しにくいのは明らかです)、そのお約束事に当たるのが IClassFactory インターフェイスです。 CoCreateInstance は内部で IClassFactory のメソッドを呼び出すのです。
IClassFactory インターフェイスは次のように定義されます。
interface IClassFactory : IUnknown { HRESULT CreateInstance( [in,unique] IUnknown* pUnkOuter, [in] REFIID riid, [out, iid_is(riid)] void** ppvObject ); HRESULT LockServer([in] BOOL fLock); }
CreateInstance メソッドは実際にインスタンスを生成するメソッド、LockServer はモジュール (DLL) のロックカウントを操作するためのメソッドです。しかし通常はロックカウントを余計に操作することは行いません。
尚、上の説明では単純化して CoCreateInstance を呼び出してオブジェクトを生成すると書きましたが、 もう少しステップを詳細に分けると、次のように成ります。
- CoCreateInstance を呼び出す
- CoGetClassObject が呼び出される
- CoLoadLibrary で DLL がロードされる
- ロードした DLL 内の DllGetClassObject 関数が呼び出される
- DllGetClassObject 内部でクラスファクトリのインスタンス (クラスオブジェクト) が作成される
- クラスオブジェクトの参照が CoGetClassObject の結果として返される
- クラスオブジェクトの IClassFactory::CreateInstance メソッドが呼び出され、 目的の COM オブジェクトが作成される
従って COM の DLL ではクラスオブジェクトの参照を返す DllGetClassObject 関数 を実装しなければなりません。
« 前の記事 | 次の記事 » | |
COM コンポーネントの登録機能 | COM コンポーネントの実装 |