次の方法で共有


サービス マップ マクロ

これらのマクロでは、サービス マップとエントリを定義します。

名前 説明
BEGIN_SERVICE_MAP ATL サービス マップの先頭をマークします。
END_SERVICE_MAP ATL サービス マップの末尾をマークします。
SERVICE_ENTRY オブジェクトで特定のサービス ID がサポートされることを示します。
SERVICE_ENTRY_CHAIN 指定されたオブジェクトにチェーンするように IServiceProviderImpl::QueryService に指示します。

要件

ヘッダー: atlcom.h

BEGIN_SERVICE_MAP

サービス マップの先頭をマークします。

BEGIN_SERVICE_MAP(theClass)

パラメーター

theClass
[入力] サービス マップを含むクラスを指定します。

解説

サービス マップを使用して、COM オブジェクトにサービス プロバイダーの機能を実装します。 最初に、IServiceProviderImpl からクラスを派生させる必要があります。 エントリには、次の 2 種類があります。

BEGIN_SERVICE_MAP(CMyService)
   SERVICE_ENTRY(SID_SBindHost)  // This object supports the SBindHost service
   SERVICE_ENTRY_CHAIN(m_spClientSite) // Everything else, just ask the container
END_SERVICE_MAP()

END_SERVICE_MAP

サービス マップの末尾をマークします。

END_SERVICE_MAP()

BEGIN_SERVICE_MAP の例を参照してください。

SERVICE_ENTRY

オブジェクトで、SIDで指定されたサービス ID がサポートされることを示します。

SERVICE_ENTRY( SID )

パラメーター

SID
サービス ID。

BEGIN_SERVICE_MAP の例を参照してください。

SERVICE_ENTRY_CHAIN

punkで指定されたオブジェクトにチェーンするように IServiceProviderImpl::QueryService に指示します。

SERVICE_ENTRY_CHAIN( punk )

パラメーター

punk
チェーン先の IUnknown インターフェイスを指すポインター。

BEGIN_SERVICE_MAP の例を参照してください。

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

関連項目

マクロ