用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 代理产生器
这个类的定义应该像下面这样:
- ››建立唯美图片特效,十个jQuery插件分享
- ››建立自己的TextView和ImageView的组合View类
- ››轻量级数据交换格式 JSON轻松入门
- ››建立虚拟专用网 使用SSH保护网络通信
- ››轻量级系统 Lubuntu 10.04 发布
- ››建立一个 Derby 日历,第 3 部分: 使用事务和锁定...
- ››建立一个 Derby 日历,第 3 部分: 使用事务和锁定...
- ››建立一个 Derby 日历,第 1 部分: 理解 JDBC
- ››建立一个 Derby 日历,第 2 部分: 嵌入选项(上)...
- ››建立一个 Derby 日历,第 2 部分: 嵌入选项(下)...
- ››建立 qt for symbian 的开发环境
- ››建立一个 Android 项目的实例
更多精彩
赞助商链接