服务映射宏
这些宏定义服务映射和条目。
名称 | 描述 |
---|---|
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
[in] 指定包含服务映射的类。
备注
使用服务映射在 COM 对象上实现服务提供程序功能。 首先,必须从 IServiceProviderImpl 派生类。 有以下两种类型的条目:
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
指示 IServiceProviderImpl::QueryService 链接到由 punk 指定的对象。
SERVICE_ENTRY_CHAIN( punk )
参数
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)可以指定使用同一个接口,尽管接口的实现在两个服务之间可能没有任何共同之处。 此方法是可行的,因为调用 QueryService
(SID_SMyService、IID_IDispatch)可以返回不同于 QueryService
(SID_SYourService、IID_IDispatch)的对象。 指定其他服务标识符时,不假定对象标识。