服務對應巨集
這些巨集會定義服務對應和專案。
名稱 | 描述 |
---|---|
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 衍生類別。 有兩種類型的專案:
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 所指定的服務識別碼。
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
。 當您指定不同的服務標識碼時,不會假設對象識別。