COM 和可连接对象中的事件

当程序检测到已发生的情况时,它可以通知其客户端。 例如,如果股票时钟周期程序检测到股票价格的变化,它可以通知所有客户更改。 此通知过程称为 触发事件

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

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

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

传出接口也由对象定义,但客户端在客户端创建的接收器对象上提供传出接口的实现。 然后,该对象调用接收器对象上的传出接口的方法,以通知客户端对象中的更改、在客户端中触发事件、从客户端请求内容,或者事实上,出于任何目的,对象创建者都想出了这些更改。

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

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

有关详细信息,请参阅以下主题: