WEB开发网
开发学院软件开发VC 用ATL建立轻量级的COM对象(4) 阅读

用ATL建立轻量级的COM对象(4)

 2006-07-21 11:44:34 来源:WEB开发网   
核心提示: 这两个类提供了三个方法:OuterQueryInterface,OuterAddRef 和 OuterRelease,用ATL建立轻量级的COM对象(4)(2),它们被用来将IUnknown的功能委派给外部实现,当实现COM的聚合和tear-offs时要用到这些方法,如果pFunc等于常量

这两个类提供了三个方法:OuterQueryInterface,OuterAddRef 和 OuterRelease,它们被用来将IUnknown的功能委派给外部实现。当实现COM的聚合和tear-offs时要用到这些方法。其它三个方法--InternalQueryInterface,InternalAddRef和 InternalRelease的作用是实现本身的引用计数以及对象接口的查询或导航。

CComObjectRootEx是个模板类,允许你针对这个类指定使用哪种ATL线程模型。(如果你想要进行条件编译,则使用CComObjectRoot就可以了,它是一个针对CComObjectRootEx<CComObjectThreadModel>的类型定义。)CComObjectRootEx从CComObjectRootBase中派生其大多数功能,它是个相当袖珍的类,只包含一个联合类型的数据成员:

union {
  long m_dwRef;
  IUnknown *m_pOuterUnknown;
};
 根据使用这个类的实际方式,联合中的成员将被用于保存给定类实例的生命周期。大多数情况下要用到m_dwRef,m_pOuterUnknown只有在支持聚合或tear-offs时用到。CComObjectRootBase提供了OuterQueryInterface,OuterAddRef和OuterRelease方法,通过m_pOuterUnknown成员转发IUnknown请求。

反过来,CComObjectRootEx提供InternalAddRef 和InternalRelease方法根据模板参数传递的线程模型来实际增减m_dwRef变量得值。注意这些例程只是增减这个变量,而没有真正删除这个对象。这是因为此对象的分配策略将由派生类中提供,派生类将使用这些例程来调整引用计数。

CComObjectRoot层次最引人注目的是它的QueryInterface实现函数,它被作为CComObjectRootBase的方法(InternalQueryInterface)输出: static HRESULT WINAPI
CComObjectRootBase::InternalQueryInterface(void *pThis,
           const _ATL_INTMAP_ENTRY *pEntries,
           REFIID riid, void **ppv);
   
  
使用ATL实现IUnknown的每一个类必须制定一个接口映射来提供InternalQueryInterface。ATL的接口映射是IID/DWORD/函数指针数组,它指示当QueryInterface请求一个给定的IID时要采取什么样的行动。其类型都是_ATL_INTMAP_ENTRY。 struct _ATL_INTMAP_ENTRY {
  const IID* piid; // 接口ID (IID)
  DWORD dw;     // 多用途值
  HRESULT (*pFunc)(void*, REFIID, void**, DWORD);
};   

这个结构的第三个成员pFunc的取值有三种情况。如果pFunc等于常量_ATL_SIMPLEMAPENTRY,则结构成员dw为对象偏移量,这时不需要函数调用,并且InternalQueryInterface完成下列操作:

Tags:ATL 建立 轻量级

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接