事件处理原则
所有事件处理共有三个步骤。 需执行以下操作:
在对象上实现事件接口。
当对象想要接收事件时,推荐事件源。
当对象不再需要接收事件时取消推荐事件源。
实现事件接口的方式将取决于其类型。 事件接口可以是 vtable、dual 或 dispinterface。 由事件源的设计器来定义接口;实现该接口由你决定。
注意
尽管不存在事件接口不能为双重的技术原因,但有一些良好的设计原因,以避免使用双接口。 但是,这是事件源的设计器/实现者做出的决定。 如果从事件 sink
的角度出发,则需要承认可能没有任何选择,只能实现双重事件接口。 有关双接口的详细信息,请参阅双接口和 ATL。
推荐事件源可以分为三个步骤:
查询 IConnectionPointContainer 的源对象。
调用 IConnectionPointContainer::FindConnectionPoint,传递感兴趣的事件接口的 IID。 如果成功,这将在连接点对象上返回 IConnectionPoint 接口。
调用 IConnectionPoint::Advise 传递事件接收器的
IUnknown
。 如果成功,则返回表示连接的DWORD
Cookie。
成功注册接收事件后,将根据源对象触发的事件调用对象事件接口上的方法。 不再需要接收事件时,可以通过 IConnectionPoint::Unadvise 将 Cookie 传回连接点。 这将中断源和接收器之间的连接。
请注意,在处理事件时避免引用周期。