IServiceProviderImpl 類別
這個類別提供介面的預設實作 IServiceProvider
。
語法
template <class T>
class ATL_NO_VTABLE IServiceProviderImpl : public IServiceProvider
參數
T
您的類別衍生自 IServiceProviderImpl
。
成員
公用方法
名稱 | 描述 |
---|---|
IServiceProviderImpl::QueryService | 建立或存取指定的服務,並傳回服務指定介面的介面指標。 |
備註
介面 IServiceProvider
會找出其 GUID 所指定的服務,並傳回服務上所要求介面的介面指標。 類別 IServiceProviderImpl
提供這個介面的預設實作。
IServiceProviderImpl
指定一種方法: QueryService,它會建立或存取指定的服務,並傳回服務指定介面的介面指標。
IServiceProviderImpl
會使用服務對應,從 BEGIN_SERVICE_MAP 開始,並以END_SERVICE_MAP結尾。
服務對應包含兩個專案:SERVICE_ENTRY,表示 物件支援的指定服務標識碼 (SID),以及呼叫鏈結至另一個物件的SERVICE_ENTRY_CHAINQueryService
。
繼承階層架構
IServiceProvider
IServiceProviderImpl
需求
標頭: atlcom.h
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
。 當您指定不同的服務標識碼時,不會假設對象識別。