次の方法で共有


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 は想定されません。

関連項目

クラスの概要