利用 ADSI 扩展重新审视 COM 聚合规则
下面简要回顾了 COM 聚合和 ADSI 扩展规则。
CreateInstance方法会返回一个指向 IUnknown 接口的指针,如下所示,该接口不会将任何函数调用委托给聚合器。
IUnknown::QueryInterface 方法会返回它所支持的接口指针,而对于它不支持的接口,则会返回错误信息。
IUnknown::AddRef 方法会增加聚合扩展对象本身的引用计数。
IUnkown::Release 方法会递减聚合扩展对象自身的引用计数,并在引用计数为 0 时销毁自身。
在执行 CreateInstance 方法时,扩展对象应存储聚合器的 IUnknown 指针,例如 m_pOuterUnknown。
扩展对象支持的所有接口(包括 IADsExtension)都应继承自 IUnknown,后者会将所有函数调用委托给聚合器。
- IUnknown::QueryInterface 调用“m_pOuterUnknown->QueryInterface”
- IUnknown::AddRef 调用“m_pOuterUnknown->AddRef”
- IUnkown::Release 调用“m_pOuterUnknown->Release”
只要符合标准的 COM 聚合规则,扩展编写器可以选择任何喜欢的内部实现方式。 请注意,扩展对象不必作为独立对象运行。 扩展的目的是用作聚合。 但是,扩展可以作为独立对象和聚合对象来编写。
除了支持标准 COM 聚合外,扩展对象还可以支持 IADsExtension 以获得更高级的功能。 如果支持后期绑定,扩展应:
- 将 IDispatch 的功能委托给聚合器。
- 在 IADsExtension 中实现 IDispatch 接口。