COM 和可连接对象中的事件

当程序检测到已发生的情况时,可以通知其客户端。 例如,如果股票代码程序检测到股价变动,可以通知所有客户端这一变动。 此通知过程称为触发事件

借助 COM,服务器对象可以使用 COM 事件触发事件,而无需任何有关通知对象的信息。 对象还可以使用可连接对象维护有关已请求通知的客户端的详细信息。

除传入接口外,COM 可连接对象还向其客户端提供传出接口。 因此,对象及其客户端可以进行双向通信。 传入接口在对象上实现,并从对象的外部客户端接收调用,而传出接口在客户端的接收器上实现,并从该对象接收调用。 该对象定义要使用的接口,由客户端进行实现。

对象定义其传入接口并提供这些接口的实现。 传入接口可通过对象的 IUnknown::QueryInterface 方法提供给客户端。 客户端对对象调用传入接口的方法,该对象代表客户端执行所需操作。

传出接口也由对象定义,但客户端在客户端创建的接收器对象上提供传出接口的实现。 然后,对象调用接收器对象上传出接口的方法,以通知客户端对象中发生的更改、在客户端中触发事件、从客户端请求事件,或者在实际情况下实现对象创建者提出的任何目的。

传出接口可以是一个由按钮控件定义的 IButtonSink 接口,用于向其客户端通知事件。 例如,当用户单击屏幕上的按钮时,按钮对象会在客户端的接收器对象上调用 IButtonSink::OnClick。 按钮控件定义传出接口。 要使按钮的客户端能够处理事件,客户端必须在接收器对象上实现该传出接口,然后将该接收器连接到按钮控件。 然后,当按钮中发生事件时,该按钮将调用接收器,此时客户端可以执行分配给该按钮的任何操作。

可连接对象提供通用的对象到客户端通信机制。 任何对象都可以使用此技术公开任何类型的事件或通知。 除了常规可连接对象技术之外,COM 还提供许多特殊用途接收器和站点接口,对象可用于通知客户端其感兴趣的特定事件。 例如,对象可以使用 IAdviseSink 来通知客户端数据并查看对象中的更改。

有关详情,请参阅以下主题: