// Ole32.dll Objbase.h
HRESULT __stdcall CoCreateInstance(
const CLSID& rclsid,
IUnknown* pUnkOuter,
DWORD dwClsContext,
const IID& riid,
void** * ppv
);
CoCreateInstance
- CLSIDを受け取り対応するコンポーネントのインスタンスを作成、そのインターフェースを返す関数
- 内部でクラスファクトリ(IClassFactory)を呼び出している
- CLSID:コンポーネントの識別子、レジストリでCLSIDからDLLのファイルパスを取得できるようになっている。
- pUnkOuter:実装に集約という手法を用いる場合に使う、使わない場合はNULL
- ClsContext:コンポーネントの実行場所をフラグで設定 クライアントと同じプロセス(DLL)/別のプロセス(.exe)/別マシン(DCOM)
- riid 返されるインターフェイスのIID
- ppv:インターフェイスへのポインタを受け取る変数
クラスファクトリ
- 他のコンポーネントを作成するためのコンポーネント
- IClassFactoryを実装
- CoGetClassObject(CLSID)でIClassFactoryインターフェイスを取得する。
- 1CLSIDにつき1クラスファクトリ
- 対応するコンポーネントを含むDllに自分で実装
interface IClassFactory :IUnknown
{
HRESULT __stdcall CreateInstance(IUnknown * pUnknownOuter, const IID& iid, void **ppv);
HRESULT __stdcall LockServer(BOOL block)
}
HRESULT __stdcall CoGetClassObject(
const CLSID& clsid,
DWORD dwClsContext,
COSERVERINFO* pServerInfo,
const IID& iid,
void** ppv
);
CoGetClassObject
- CLSIDを受け取り、対応するコンポーネントを生成するクラスファクトリのインターフェイスへのポインタを返す。
- DLLGetClassObject()を呼び出す。
- COSERVERINFO:DCOM(≒リモートPC上にコンポーネントがある場合)のアクセス制御に用いる
STDAPI DllGetClassObject(
const CLSID& clsid,
const IID& iid,
void** ppv
);
DllGetClassObject
- CLSIDを受け取り、対応するコンポーネントを生成するクラスファクトリのインターフェイスへのポインタを返す。
- コンポーネントを含むDLLに自分で実装する。
akatukisiden について
フリーランスプログラマ
使用言語はC++,C#とそのつなぎのC++/CLI
専門はクライアントアプリ開発