サービス マップ マクロ
これらのマクロでは、サービス マップとエントリを定義します。
名前 | 説明 |
---|---|
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 種類があります。
SERVICE_ENTRY: 指定されたサービス ID (SID) のサポートを示します。
SERVICE_ENTRY_CHAIN: 別の指定されたオブジェクトにチェーンするように IServiceProviderImpl::QueryService に指示します。
例
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 は想定されません。