没办法暴露出来。所以COM中很少用事件,ActiveX Control中的事件就用了ConnectionPoint来实现的。
Delphi 和自动化对事件思想提供了两种完全不同的方法。
(1) Delphi 中的事件
Delphi 对事件的处理遵从了KISS(Keep it simple,stupid!)方法论。
事件被作为方法指针来实现—这些指针分别指向应用程序中的一些
方法,并在通过方法指针调用方法的时候被执行。例如,假设要
在应用程序的一个控件中处理一个事件。如果抽象地看待这种情形,
那么本例中的“服务器”就是一个控件,它定义和触发事件。而
“客户端”就是使用这个控件的应用程序,因为它通过给事件方法
指针指定一些特殊的方法名而与事件相连。
虽然这种简单的事件模型是使Delphi 简单易用的原因之一,但它
必然以牺牲了某些功能为代价。例如,它没有一种允许多个用户监
听同一事件(称为多点广播)的内嵌功能,也无法在不编写RTTI 代码
的情况下动态地得到一个事件的类型描述。
(2) 自动化中的事件
相对于Delphi 简单却功能有限的事件模型而言,自动化的事件模型
功能强大但却复杂得多。作为一个COM 程序员,你也许会认为自动
化中的事件是通过接口来实现的。事件只是作为接口的一部分。这
里的接口常被称为事件接口或输出接口(outgoing interface)。之
所以称之为输出接口,是因为它不像别的接口那样是由服务器实现
的,而是由服务器的客户端来实现;接口的方法从服务器端被外调
到了客户端。像所有的接口一样,每个事件接口都有其相应的IID
(接口标识符)以唯一地标识它们。另外在自动化对象的类型库中能
够找到事件接口的描述。需要向客户端提供事件接口的服务器必须
实现IConnectionPointContainer接口。