IServiceProviderImpl クラス
このクラスは、IServiceProvider
インターフェイスの既定の実装を提供します。
構文
template <class T>
class ATL_NO_VTABLE IServiceProviderImpl : public IServiceProvider
パラメーター
T
IServiceProviderImpl
から派生したクラス。
メンバー
パブリック メソッド
名前 | 説明 |
---|---|
IServiceProviderImpl::QueryService | 指定されたサービスを作成またはアクセスし、サービスの指定したインターフェイスにインターフェイス ポインターを返します。 |
解説
IServiceProvider
インターフェイスはその GUID によって指定されたサービスを特定し、サービスで要求されたインターフェイスのインターフェイス ポインターを返します。 クラス IServiceProviderImpl
により、インターフェイスの既定の実装が提供されます。
IServiceProviderImpl
は、指定されたサービスを作成またはアクセスし、サービスの指定されたインターフェイスへのインターフェイス ポインターを返す QueryService という 1 つのメソッドを指定します。
IServiceProviderImpl
は、BEGIN_SERVICE_MAP で始まり、END_SERVICE_MAP で終わるサービス マップを使用します。
サービス マップには、次の 2 つのエントリが含まれています。オブジェクトでサポートされている指定されたサービス ID (SID) を示す SERVICE_ENTRY と、別のオブジェクトにチェーンを行う QueryService
を呼び出す SERVICE_ENTRY_CHAIN です。
継承階層
IServiceProvider
IServiceProviderImpl
要件
ヘッダー: atlcom.h
IServiceProviderImpl::QueryService
指定されたサービスを作成またはアクセスし、サービスの指定したインターフェイスにインターフェイス ポインターを返します。
STDMETHOD(QueryService)(
REFGUID guidService,
REFIID riid,
void** ppvObject);
パラメーター
guidService
[入力] サービス識別子 (SID) を指すポインター。
riid
[入力] 呼び出し元がアクセスを取得するインターフェイスの識別子。
ppvObj
[出力] 要求されたインターフェイスを指す間接ポインター。
戻り値
返される HRESULT 値は、次のいずれかの値です。
戻り値 | 意味 |
---|---|
S_OK | サービスが正常に作成または取得されました。 |
E_INVALIDARG | 1 つ以上の引数が無効です。 |
E_OUTOFMEMORY | サービスを作成するにはメモリが不十分です。 |
E_UNEXPECTED | 不明なエラーが発生しました。 |
E_NOINTERFACE | 要求されたインターフェイスが、このサービスの一部ではないか、サービスが不明です。 |
解説
QueryService
により、指定されたサービス内の要求されたインターフェイスを指す間接ポインターが返されます。 呼び出し元は、不要になったときにこのポインターを解放する必要があります。
QueryService
を呼び出す場合は、サービス識別子 (guidService) とインターフェイス識別子 (riid) の両方を渡します。 guidService は、アクセスするサービスを指定し、riid はサービスの一部であるインターフェイスを識別します。 それと引き換えに、インターフェイスを指す間接ポインターを受け取ります。
インターフェイスを実装するオブジェクトは、他のサービスの一部であるインターフェイスを実装する場合もあります。 次の点について検討してください。
これらのインターフェイスの一部は省略可能な場合があります。 サービスの説明で定義されているすべてのインターフェイスが、サービスのすべての実装、またはすべての返されるオブジェクトに必ずしも存在するとは限りません。
QueryInterface
の呼び出しとは異なり、別のサービス識別子を渡しても、必ずしも別のコンポーネント オブジェクト モデル (COM) オブジェクトが返されるとは限りません。返されるオブジェクトには、サービスの定義の一部ではない追加のインターフェイスがある場合があります。
SID_SMyService や SID_SYourService などの 2 つの異なるサービスでは、インターフェイスの実装に、これら 2 つのサービス間で共通するものが含まれていない場合でも、同じインターフェイスの使用を指定できます。 これは、QueryService
(SID_SMyService、IID_IDispatch) への呼び出しが QueryService
(SID_SYourService、IID_IDispatch) とは異なるオブジェクトを返す可能性があるという理由で機能します。 別のサービス識別子を指定した場合、オブジェクト ID は想定されません。