实现建议接收器对象
适用于:Outlook 2013 | Outlook 2016
客户端可以实现自己的建议接收器对象,也可以使用实用工具函数 HrAllocAdviseSink。 HrAllocAdviseSink 使用 OnNotify 的实现创建建议接收器对象,该对象调用回调函数。
使用 HrAllocAdviseSink 有优点和缺点。 它可以保存工作,但它不提供对引用计数的控制,它创建的建议接收器对象。 因此,需要仔细控制其建议接收器的发布或在其建议接收器与另一个客户端对象之间具有依赖关系的客户端应构建自己的 IMAPIAdviseSink 实现,并完全避免使用 HrAllocAdviseSink 。
实现自己的建议接收器的客户端应使其成为与任何其他对象无关或不依赖于任何其他对象的独立对象,以便消除引用计数和对象释放中的潜在复杂问题。 但是,如果必须将建议接收器实现为另一个对象的一部分,或者将指向另一个对象的后退指针作为数据成员,则建议保留两个单独的引用计数:一个用于建议接收器引用的对象,一个用于建议接收器。
当被引用对象的引用计数降至零时,其所有方法都可能失败,并且可以销毁其 vtable,但建议接收器的内存必须保持不变,直到其引用计数也降至零为止。 这意味着建议接收器的 Release 方法必须递减其引用计数,并在该计数达到零时完成该对象的销毁。 如果未维护两个单独的引用计数,则很容易在包含对象的 发布 过程中无意中销毁建议接收器。
使用 HrAllocAdviseSink 实现建议接收器的客户端必须同样小心,不要将其回调函数作为方法包含在另一个建议接收器对象中。 对于 C++ 客户端,这样做很诱人,并将 此 指针作为参数传递。 这是一种危险的策略,因为当对象的引用计数达到零时,客户端通常会释放对象。 释放建议接收器对象的内存会使 此 指针无效。
根据事件的类型和建议源, OnNotify 方法可以通过各种方式处理事件。 下表提供了如何处理某些标准事件的建议。
事件类型 | OnNotify 中的处理 |
---|---|
对象已移动 |
如果移动对象的原始父级与新父级相关,请更新从层次结构中最高的文件夹或通讯簿容器开始的视图。 如果两个父容器不相关,请更新其两个视图。 |
新消息 |
更改用户界面以通知用户一个或多个新消息的到达。 将接收文件夹置于当前视图中。 |
错误 |
对于会话以外的所有对象,如有必要,请记录错误并返回 。 对于会话对象,请尽可能注销。 |
搜索完成 |
无需处理。 |
注意
通知处理程序应可重入。