MAPI 中的事件通知

适用于:Outlook 2013 | Outlook 2016

事件通知是两个 MAPI 对象之间的信息通信。 通过其中一个对象,客户端或服务提供商注册更改或错误通知,称为事件,该事件可能发生在另一个对象中。 事件发生后,将通知第一个对象更改或错误。 接收通知的对象称为建议接收器;负责通知的对象称为建议源。

有三种类型的建议接收器对象 (所有类型都是标准 MAPI 对象) :

  • 建议接收器对象。
  • 表单建议接收器对象。
  • 查看建议接收器对象。

建议接收器对象是最常见的类型。 建议接收器通常由客户端应用程序实现,以接收通讯簿和消息存储通知并支持 IMAPIAdviseSink :IUnknown 接口。 IMAPIAdviseSink 包含单个方法 IMAPIAdviseSink::OnNotify。 表单和视图建议接收器不太常见:实现它们以接收有关自定义窗体更改的通知。 表单建议接收器支持 IMAPIFormAdviseSink : IUnknown 接口和 view 建议接收器支持 IMAPIViewAdviseSink : IUnknown 接口。 由于大多数客户端实现标准建议接收器对象,因此假定对通知的讨论与通讯簿和消息存储通知相关,而不是表单通知。 有关表单通知的详细信息,请参阅 MAPI 窗体通知编写表单服务器代码

建议源对象由服务提供商和 MAPI 实现。 并非所有服务提供商都支持事件通知;这是可选的,但强烈建议使用。 消息存储和通讯簿提供程序通常支持对其多个对象发出对象通知,支持对其内容和层次结构表的表通知。 传输提供商不支持直接通知;它们依赖于与客户端通信的替代方法。

与建议接收器不同,建议源对象不是 MAPI 对象的唯一类型。 许多 MAPI 对象(如消息存储和表)可以充当建议源的角色。 建议源是执行以下操作的任何 MAPI 对象:

  • 实现 建议 方法以接收通知注册。

  • 实现 Unadvise 方法来接收通知取消。

  • 为通过调用 IMAPIAdviseSink::OnNotify 方法注册的相应建议接收器对象生成相应类型的通知。

实现建议接收器对象的客户端在想要注册通知时调用 Advise ,在大多数情况下,会传入应用于注册的对象的条目标识符 ,并在要 取消注册时取消添加。 客户端将参数传递给 “建议 ”,指示要监视的几种类型的事件中的哪一种。 建议 返回一个非零数,表示建议接收器与建议源之间的成功连接。

在调用 Advise 之前,客户端可以通过检查是否在消息存储的 PR_STORE_SUPPORT_MASK (PidTagStoreSupportMask) 属性中设置了STORE_NOTIFY_OK标志来确定消息存储提供程序是否支持通知。 客户端无法提前确定通讯簿提供商是否支持通知。 客户端必须尝试注册,如果尝试失败,可以假定不支持通知。

当发生客户端已注册的事件时,建议源使用包含事件相关信息的通知数据结构调用其 IMAPIAdviseSink::OnNotify 方法,从而通知建议接收器。 建议接收器的 OnNotify 实现可以执行响应通知的任务,例如更新内存中的数据或刷新屏幕显示。

服务提供商可以手动实现对通知的支持,或者利用 三种 IMAPISupport 方法中提供的帮助: IMAPISupport::SubscribeIMAPISupport::UnsubscribeIMAPISupport::NotifySubscribeUnsubscribe 方法处理提供程序的通知注册和注销;Notify 方法在适当时处理发送通知。

若要使用支持对象方法进行通知注册,服务提供商在其建议方法中调用 IMAPISupport::Subscribe,并传递给订阅客户端传递给建议的建议接收器指针。 如果将入口标识符作为输入参数传递以指定建议源,则服务提供商会将其转换为二进制密钥。 订阅 创建一个唯一的连接号,服务提供商返回给客户端的正是此编号。 在 建议调用完成后 ,服务提供商可以随时释放客户端的建议接收器对象指针。

当客户端调用 Unadvise 以取消注册时,服务提供商要么递减客户端的建议接收器指针上的引用计数,要么调用 Unsubscribe 来执行相同的操作。

在生成通知时,服务提供商将执行与通知相关的任何内部处理,并通过将其所有未使用成员设置为零来初始化 NOTIFICATION 结构。 这种用于初始化 NOTIFICATION 结构的技术可以帮助客户端创建更小、更快、更不易出错的 OnNotify 实现。

下图显示了建议接收器对象、建议源对象和 MAPI 之间的通信。 仅当建议源调用 IMAPISupport 方法以获取通知支持时,才会涉及 MAPI。

事件通知调用

事件通知调用

MFCMAPI CAdviseSink 类使用 AdviseSink.h (,AdviseSink.cpp文件) 为所有对 Advise 的调用实现建议接收器对象。 有关 MFCMAPI 的详细信息,请参阅 MFCMAPI 作为代码示例MFCMAPI