支持事件通知

适用于:Outlook 2013 | Outlook 2016

由于支持事件通知可能很复杂,因此 MAPI 提供了三种支持对象方法,用于实现流程中最困难的部分。 这些方法作为一个单元工作,提供程序必须使用所有三个方法,或者不使用它们。

MAPI 支持方法使用通知密钥来管理建议接收器与生成通知的对象之间的连接。 通知键是一种 NOTIFKEY 结构,它包含标识跨进程的对象的二进制数据。 通知密钥通常是从建议源对象的长期条目标识符复制的。 如果客户端在 对 Advise 的调用中提供了入口标识符,则可以将其用于通知密钥。 如果建议lpEntryID 参数为 NULL,请使用最外层的可能容器对象的入口标识符,例如消息存储区。

若要使用支持方法,请在客户端调用建议方法注册通知时调用 IMAPISupport::Subscribe。 分配 NOTIFKEY 结构并为建议源对象创建唯一的通知密钥。 例如,消息存储提供程序在收到邮件到特定文件夹中时提示通知客户端,会为该文件夹创建通知密钥。 在对 Subscribe 的调用中传递指向 NOTIFKEY 结构的指针,以及指向客户端的建议接收器的指针。 订阅 调用建议接收器的 IUnknown::AddRef 方法来增加其引用计数,MAPI 将保留指针,直到取消注册。

可以将NOTIFY_SYNC标志传递给 “订阅 ”请求, 该请求 Notify 行为同步,在对已注册建议接收器的 IMAPIAdviseSink::OnNotify 方法进行所有调用之前不会返回。 设置此标志仅供内部使用。 在响应客户端 建议 调用时不要设置它。 客户端和提供程序之间的事件通知始终是异步的。 也就是说,MAPI 保证发生事件的调用将在进行任何 OnNotify 调用之前返回到客户端。

如果设置NOTIFY_SYNC标志,请不要对任何建议接收器对象进行任何更改,也不会将 HrThisThreadAdviseSink 创建的包装器建议接收器传递给 订阅HrThisThreadAdviseSink 创建建议接收器的线程安全版本,以便仅用于异步通知。

如果注册同步通知的建议接收器从设置了 CALLBACK_DISCONTINUE 标志的 OnNotify 返回, 则 IMAPISupport::Notify 将设置NOTIFY_CANCELED标志并返回,而不会对 OnNotify 进行任何调用。

订阅 返回后, 不再需要保留客户端的建议接收器的副本。 调用其 IUnknown::Release 方法将其释放。 订阅 将返回应返回到客户端的非零连接编号。 连接号表示建议源与建议接收器之间的链接。 在客户端成功调用 Unadvise 之前,它仍然有效。

当客户端准备好取消注册时,它会调用 Unadvise 方法。 将 Unadvise 调用中的连接号码传递到 IMAPISupport::Unsubscribe取消订阅 调用建议接收器的 IUnknown::Release 方法。 与 “建议 ”和 “取消订阅”一样,必须配对对 “订阅”“取消订阅”的 调用。 对于要订阅的每个调用,必须对取消订阅进行一次调用。 但是,无需每次调用建议方法时调用 Subscribe。 相反,可以调用它来设置内部通知。

发生事件时,请分配一个或多个适用于该事件的类型的 NOTIFICATION 结构,并调用 IMAPISupport::Notify通知 为每个已注册的建议接收器生成通知。 应将 NOTIFICATION 结构的所有未使用成员设置为零。 这种用于初始化 NOTIFICATION 结构的技术可以帮助客户端创建更小、更快、更不易出错的 OnNotify 实现。

请注意,对于每个事件,即使是同一类型的多个事件,都需要单独的 NOTIFICATION 结构。 例如,如果为特定表上的表通知注册了三个客户端,并且向表添加了五行,则必须为 Notify 调用创建五个OBJECT_NOTIFICATION结构。 与五次调用 Notify 相比,此类批处理通知的性能更好。 对于每个 Notify 调用,MAPI 调用每个已注册的建议接收器的 IMAPIAdviseSink::OnNotify 方法。 如果没有已注册的建议接收器,MAPI 将忽略调用。

发送批处理通知的服务提供商必须对其进行排序,以便从第一个通知解释到最后一个通知。 当通知批包含一系列事件(例如TABLE_ROW_ADDED一个事件引用同一批中另一个事件中添加的前一行)时,这种排序尤其必要。

另请参阅

MAPI 服务提供商