原文:深入解析连接点
Connection Point Internals Working with ATL 8
示例代码
关键字:
COM ATL 连接点 进程间通信 代理存根 双接口 自定义接口
0-我要讲什么
(1) 介绍连接点
(2) 实现一个简单的连接点
(3) 用双接口实现连接点来进行进程间通信
(4) 用自定义接口实现连接点来进行进程间通信
(5) 小结
1-介绍连接点
什么是连接点?描述一个概念不是我的长项,所以我就从《深入解析ATL》(Brent Rector、Chris Shells著 潘爱民 新语 译)上摘抄了三段来充数。 J
术语连接点(connection point)指的是一种逻辑上的反馈机制, 这种反馈机制允许对象暴露其“调用一个或者多个指定接口”的能力。
一个连接有两个部分:对指定接口的方法产生调用的对象:被称作源(source)或者连接点(connection point);以及实现该接口(即接收调用的接口)的对象,被称作接收对象(sink object) ,有些书上也叫接收器 。
虽然这个连接点协议在套间内部使用是可以被接受的,但是对于跨越套间边界的使用是非常低效的(当考虑到来回调用开销的时候)。
术语一类的东西向来让我找不着北,要对概念理解的更深入,就必需多实践,在实践中发现问题, 解决问题。吃一堑,长一智嘛 J
2-实现一个简单的连接点
在实现连接点之前,相信还是十分有必要简单的介绍一下回调接口的概念和方法。回调接口的原理和使用很简单,和回调函数差不多,唯一不同的是回调函数只有一个,而作为函数集合的接口,回调接口其实就是回调函数的集合。大家如果不明白回调接口的话,推荐大家去看看杨老师的文章,明白之后再回过头来看连接点 J 。(谁是杨老师?什么!你连杨老师都不知道?这,这,这 … 赶紧去搜索一下 J )
好了,第一个例子我想让代码尽量的少,以方便我们看清连接点的本质,所以我要用自定义接口来实现。
我要实现的例子很简单,
有个组件叫Teacher实现了ISpeaker接口,并实现一个连接点_ISpeakerEvents
另一个组件叫Student,实现了_ISpeakerEvents这个连接点的接收器。
终于可以动手写程序了--------- J J J
(1)首先新建一个工程,解决方案叫SimpleSpeaker,工程名称Teacher

图2-1
(2)选择工程属性,直接用默认的配置,直接点“完成” J
(关于各选项的作用我这里就不介绍了,相信大家应该都在介绍COM的书上或多或少的了解过)

图2-2
(3)我们将看到下图的一个程序类图。紧接着,在类视图中添加一个类。

图2-3
(4)插入一个ATL简单对象,简称:Speaker,并“下一步”,在选项中我们用的是自定义接口,并勾上了连接点,选好之后点“完成”。 J

图2-4

图2-5
(5)ATL默认的连接点接口定义是一个双接口,而我想要的是一个自定义接口的连接点,所以需要在IDL文件中做下修改:
library TeacherLib
{ 
// 此处省略N行 … … 
interface _ISpeakerEvents : IUnknown // 由 dispinterface _ISpeakerEvents 修改而来 
{ 
// 为了又双接口改成自定义接口所做的修改三个地方而以 
// +_+ 改完记得编译一下这个文件 
//properties: 
//methods: 
[ helpstring ( " 方法 OnHearSpeak" )] HRESULT OnHearSpeak ([ in ] BSTR bstrSpeech ); 
}; 
// 此处省略N行 … … 
coclass Speaker 
{ 
[ default ] interface ISpeaker ; 
[ default , source ] interface _ISpeakerEvents ; // dispinterface _ISpeakerEvents; 
}; 
};

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/41101.html