CoGetClassObject 関数 (combaseapi.h)
指定した CLSID に関連付けられているクラス オブジェクト上のインターフェイスへのポインターを提供します。 CoGetClassObject は 、これを行うために必要な実行可能コードを検索し、必要に応じて動的に読み込みます。
CoGetClassObject を直接呼び出して、システム レジストリに CLSID があるクラス オブジェクトを介して複数のオブジェクトを作成します。 特定のリモート コンピューターからクラス オブジェクトを取得することもできます。 ほとんどのクラス オブジェクトは 、IClassFactory インターフェイスを 実装します。 その後、 CreateInstance を呼び出して、初期化されていないオブジェクトを作成します。 ただし、必ずしもこのプロセスを実行する必要はありません。 1 つのオブジェクトを作成するには、 CoCreateInstanceEx 関数を呼び出します。これにより、リモート コンピューター上にインスタンスを作成できます。 これにより 、CoCreateInstance 関数が置き換えられます。これは、ローカル コンピューター上にインスタンスを作成するために引き続き使用できます。 どちらの関数も、クラス オブジェクトへの接続、インスタンスの作成、およびクラス オブジェクトの解放をカプセル化します。 CoGetInstanceFromFile と CoGetInstanceFromIStorage という他の 2 つの関数は、リモート システムでのインスタンスの作成とオブジェクトのアクティブ化の両方を提供します。 1 つの型のオブジェクトを作成し、そのオブジェクトのインターフェイスへのポインターを提供することを目的とする関数とインターフェイス メソッドは多数あります。
構文
HRESULT CoGetClassObject(
[in] REFCLSID rclsid,
[in] DWORD dwClsContext,
[in, optional] LPVOID pvReserved,
[in] REFIID riid,
[out] LPVOID *ppv
);
パラメーター
[in] rclsid
オブジェクトの作成に使用するデータとコードに関連付けられている CLSID。
[in] dwClsContext
実行可能コードを実行するコンテキスト。 リモート アクティブ化を有効にするには、CLSCTX_REMOTE_SERVERを含めます。 コンテキスト値とその使用方法の詳細については、 CLSCTX 列挙を参照してください。
[in, optional] pvReserved
クラス オブジェクトをインスタンス化するコンピューターへのポインター。 このパラメーターが NULL の場合、クラス オブジェクトは、dwClsCtx パラメーターの解釈に従って、現在のコンピューターまたはクラスの RemoteServerName キーで指定されたコンピューターでインスタンス化されます。 「COSERVERINFO」を参照してください。
[in] riid
インターフェイスの識別子への参照。正常な戻り時に ppv で指定されます。 このインターフェイスは、クラス オブジェクトと通信するために使用されます。 通常、この値はIID_IClassFactoryですが、ライセンスの形式をサポートする IID_IClassFactory2 などの他の値も許可されます。 すべての OLE 定義インターフェイス IID は、OLE ヘッダー ファイルで IID_interfacenameとして定義されます。interfacename はインターフェイスの名前です。
[out] ppv
riid で要求されたインターフェイス ポインターを受け取るポインター変数のアドレス。 正常に戻ると、*ppv には要求されたインターフェイス ポインターが含まれます。
戻り値
この関数は、次の値を返すことができます。
リターン コード | 説明 |
---|---|
|
指定したクラス オブジェクトへの場所と接続が成功しました。 |
|
CLSID が正しく登録されていません。 このエラーは、 dwClsContext で指定した値がレジストリにないことを示す場合もあります。 |
|
ppv が指すオブジェクトは、riid で識別されるインターフェイスをサポートしていないか、またはE_NOINTERFACE返されたクラス オブジェクトに対する QueryInterface 操作をサポートしていません。 |
|
登録データベースの読み取り中にエラーが発生しました。 |
|
インプロセス DLL またはハンドラー DLL が見つかりませんでした (コンテキストに応じて)。 |
|
実行可能ファイル (.exe) が見つかりませんでした (CLSCTX_LOCAL_SERVERのみ)。 |
|
読み込み時に一般的なアクセス エラーが発生しました。 |
|
実行可能イメージにエラーがあります。 |
|
実行可能ファイルは起動されましたが、クラス オブジェクトを登録しませんでした (シャットダウンしている可能性があります)。 |
解説
OLE のクラス オブジェクトは、オブジェクトのグループに共通する操作を許可するインターフェイスをサポートする中間オブジェクトです。 このグループ内のオブジェクトは、単一の CLSID で表されるのと同じオブジェクト定義から派生したインスタンスです。 通常、クラス オブジェクトに実装されるインターフェイスは IClassFactory です。これにより、特定の定義 (クラス) のオブジェクト インスタンスを作成できます。
CoGetClassObject の呼び出しは、呼び出し元にクラス オブジェクトへのアクセスを (riid パラメーターで指定されたインターフェイスへのポインターを介して) 作成、初期化、および提供します。 クラス オブジェクトは、 rclsid パラメーターで指定した CLSID に関連付けられたオブジェクトです。 システムがコンピューター内で関連付けられているコードとデータを見つける方法の詳細は、呼び出し元に対して透過的です。読み込まれていないコードの動的読み込みも同様です。
リモートアクティブ化が必要であることを示すクラス コンテキストがCLSCTX_REMOTE_SERVERされている場合、 pServerInfo パラメーターに指定された COSERVERINFO 構造体を使用すると、サーバーが配置されているコンピューターを指定できます。 pServerInfo が NULL の場合にリモート サーバーを検索するために使用されるアルゴリズムについては、CLSCTX 列挙を参照してください。
クラスの CLSID を見つけるには、次の 2 つの場所があります。
- レジストリは、CLSID とファイル サフィックスの間、およびオブジェクトのクラスを決定するための CLSID とファイル署名の間の関連付けを保持します。
- オブジェクトを永続ストレージに保存すると、その CLSID はデータと共に格納されます。
riid パラメーターは、クライアントがクラス オブジェクトとの通信に使用するインターフェイスを指定します。 ほとんどの場合、このインターフェイスは IClassFactory です。 これにより、 CreateInstance メソッドにアクセスできます。これにより、呼び出し元は、その実装で指定された種類の初期化されていないオブジェクトを作成できます。 CLSID を使用してシステムに登録されているすべてのクラスは、 IClassFactory を実装する必要があります。
ただし、まれに、オブジェクトのセットに共通する操作を定義する他のインターフェイスを指定することもできます。 たとえば、OLE がモニカーを実装する方法では、クラス オブジェクトのインターフェイスは IParseDisplayName であり、オブジェクトの表示名をモニカーに変換するために使用されます。
dwClsContext パラメーターは実行コンテキストを指定します。これにより、1 つの CLSID をさまざまな実行コンテキスト内の異なるコードに関連付けられます。 CLSCTX 列挙は、使用可能なコンテキスト フラグを指定します。 CoGetClassObject は 、(示されているコンテキストに応じて) CoRegisterClassObject 関数を呼び出して現在登録されているレジストリ オブジェクトとクラス オブジェクトの両方を参照します。
クラス オブジェクトを解放するには、クラス オブジェクトの Release メソッドを使用します。 CoRevokeClassObject 関数は、システム レジストリからクラス オブジェクトの CLSID を削除する場合にのみ使用されます。
要件
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリのみ] |
対象プラットフォーム | Windows |
ヘッダー | combaseapi.h (Objbase.h を含む) |
Library | Ole32.lib |
[DLL] | Ole32.dll |