服務對應巨集

這些宏會定義服務對應和專案。

名稱 描述
BEGIN_SERVICE_MAP 標記 ATL 服務對應的開頭。
END_SERVICE_MAP 標記 ATL 服務對應的結尾。
SERVICE_ENTRY 表示物件支援特定的服務標識碼。
SERVICE_ENTRY_CHAIN 指示 IServiceProviderImpl::QueryService 鏈結至指定的物件。

需求

標頭: atlcom.h

BEGIN_SERVICE_MAP

標示服務對應的開頭。

BEGIN_SERVICE_MAP(theClass)

參數

theClass
[in]指定包含服務對應的類別。

備註

使用服務對應在 COM 物件上實作服務提供者功能。 首先,您必須從 IServiceProviderImpl 衍生類別。 有兩種類型的專案:

範例

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指定的服務識別碼。

SERVICE_ENTRY( SID )

參數

SID
服務標識碼。

範例

請參閱BEGIN_SERVICE_MAP範例

SERVICE_ENTRY_CHAIN

指示 IServiceProviderImpl::QueryService 鏈結至 punk指定的物件。

SERVICE_ENTRY_CHAIN( punk )

參數

朋克
要鏈結之 IUnknown 介面的指標。

範例

請參閱BEGIN_SERVICE_MAP範例

IServiceProviderImpl::QueryService

建立或存取指定的服務,並傳回服務指定介面的介面指標。

STDMETHOD(QueryService)(
    REFGUID guidService,
    REFIID riid,
    void** ppvObject);

參數

guidService
[in]服務標識子的指標(SID)。

riid
[in]呼叫端要取得存取權之介面的標識碼。

ppvObj
[out]所要求介面的間接指標。

傳回值

傳回的 HRESULT 是下列其中一個值:

傳回值 意義
S_OK 已成功建立或擷取服務。
E_INVALIDARG 一或多個引數無效。
E_OUTOFMEMORY 記憶體不足,無法建立服務。
E_UNEXPECTED 發生未知的錯誤。
E_NOINTERFACE 要求的介面不是此服務的一部分,或服務未知。

備註

QueryService 傳回指定服務中要求介面的間接指標。 呼叫端負責在不再需要此指標時釋放此指標。

當您呼叫 QueryService時,您會傳遞服務標識碼 (guidService) 和介面識別碼 (riid)。 guidService 會指定要存取的服務,而 riid 會識別屬於服務一部分的介面。 在傳回中,您會收到介面的間接指標。

實作介面的物件也可能實作屬於其他服務的介面。 請考慮下列可能性:

  • 其中有些介面可能是選擇性的。 並非所有在服務描述中定義的介面都存在於服務的每個實作或每個傳回的物件上。

  • 不同於對 QueryInterface的呼叫,傳遞不同的服務標識符不一定表示傳回不同的元件物件模型 (COM) 物件。

  • 傳回的物件可能會有不屬於服務定義的其他介面。

兩個不同的服務,例如SID_SMyService和SID_SYourService,都可以指定使用相同的介面,即使介面的實作在兩個服務之間可能沒有任何共同之處。 這種方法的運作方式,因為對 (SID_SMyService, IID_IDispatch) 的呼叫 QueryService 可以傳回與 (SID_SYourService, IID_IDispatch) 不同的物件 QueryService 。 當您指定不同的服務標識碼時,不會假設對象識別。

另請參閱

巨集