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

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

 2006-07-21 11:44:24 来源:WEB开发网   
核心提示: 其次,为了防止每一个基类继承主对象的 QueryInterface 实现,用ATL建立轻量级的COM对象(8)(2),IConnectionPointImpl中第一个虚函数不是QueryInterface,而是一个类型兼容的方法,(如下图五)它们会读取接口的类型库描述并产生 IConnec

其次,为了防止每一个基类继承主对象的 QueryInterface 实现,IConnectionPointImpl中第一个虚函数不是QueryInterface。而是一个类型兼容的方法,它叫做 LocCPQueryInterface,这个方法只针对 IID_IConnectionPoint 和 IID_IUnknown。它除了涉及允许完全基于多线程实现外,还有许多深奥的窍门在里面。

对象的 FindConnectionPoint 方法实现使用由 ATL中 CONNECTION_POINT 宏定义的连接点映射。此映射是对象中的一个 DWORD表,表示与 IConnectionPoint 实现相对应的偏移量。FindConnectionPoint 遍历此偏移量数组,询问每一个所碰到的连接点,看看此连接是否拥有所请求的接口。

上述例子建立了一个有效的对象实现,它支持作为 outbound 接口的 IStopSink 和 IPageSink 。但是,为了调用outbound 接口,你需要存取由 IConnectionPointImpl 类操纵的接口指针向量,并自己手动模拟多点传送:

typedef IConnectionPointImpl base;
for (IUnknown** pp = base::m_vec.begin();
   pp < base::m_vec.end();
   pp++)
  if (*pp)
  ((IPageSink*)(*pp))->OnPageRecieved();
   

编写多点传送例程十分繁琐。所幸的是,ATL提供了 Visual Studio 组件—— ATL 代理产生器(ATL Proxy Generator),(如下图五)它们会读取接口的类型库描述并产生 IConnectionPointImpl 派生类,为每一个 outbound 方法添加适当的 Fire 例程。连结点代理便被产生出来。

图五 ATL 代理产生器 

这个类的定义应该像下面这样:

Tags:ATL 建立 轻量级

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