状态表

适用于:Outlook 2013 | Outlook 2016

状态表包含与当前会话状态相关的信息。 每个 MAPI 会话都有一个状态表,其中包括 MAPI 和服务提供商提供的信息。 MAPI 提供三行数据:MAPI 子系统的行、MAPI 后台处理程序的行和集成通讯簿的一行。 由于需要传输提供程序才能向状态表提供状态信息,因此每个活动传输提供程序都有一行。 通讯簿和消息存储提供程序可以选择是否支持状态表。

由于每行由不同的资源提供,因此列集可能因行而异。 每个状态对象都需要提供一组列,MAPI 提供一组列。 服务提供程序可以添加到这些集中,以公开提供程序特定的属性。 例如,消息存储提供程序可能会添加 PR_STORE_RECORD_KEY (PidTagStoreRecordKey) ,以便为客户端提供其消息存储的标识符。 客户端必须事先了解是否存在此额外信息才能使用它。

下表列出了每个状态表行中必须包含的属性。 状态对象的实现者提供一些属性;其他由 MAPI 计算。

状态对象提供的属性 MAPI 提供的属性
PR_DISPLAY_NAME (PidTagDisplayName)
PR_PROVIDER_DLL_NAME (PidTagProviderDllName)
PR_STATUS_CODE (PidTagStatusCode)
PR_RESOURCE_FLAGS (PidTagResourceFlags)
PR_RESOURCE_METHODS (PidTagResourceMethods)
PR_RESOURCE_TYPE (PidTagResourceType)

如果状态对象提供标识,则它应设置 PR_IDENTITY_DISPLAY (PidTagIdentityDisplay) 、 PR_IDENTITY_ENTRYID (PidTagIdentityEntryId) 和 PR_IDENTITY_SEARCH_KEY (PidTagIdentitySearchKey) ,并在表中包括这些属性。

MAPI 为每个状态表行计算四个属性:

属性 ...
PR_ENTRYID (PidTagEntryId)
PR_INSTANCE_KEY (PidTagInstanceKey)
PR_OBJECT_TYPE (PidTagObjectType)
PR_ROWID (PidTagRowid)

MAPI 将条目标识符分配给状态行,使客户端能够打开相应的状态对象。 还将分配行标识符来标识表中的行,作为用于标识状态对象中的数据的实例键。 PR_OBJECT_TYPE 属性设置为 MAPI_STATUS。

若要访问状态表,客户端调用 IMAPISession::GetStatusTable 方法。 启动时不应立即发出此调用。 这是因为 GetStatusTable 必须等待 MAPI 后台处理程序初始化传输提供程序,该操作将推迟到客户端完成登录后。 GetStatusTable 是在 MAPI 后台处理程序完成其启动处理后相对快速的调用。

状态表信息可以通过多种方式使用,例如访问状态对象、确定客户端是在连接模式还是脱机模式下运行,以及监视提供程序的状态。 例如,客户端可以通过将 PR_ENTRYID 属性的值传递给 IMAPISession::OpenEntry 方法来打开特定服务提供程序的状态对象。 status 对象支持 IMAPIStatus 接口,该接口包含更改服务提供商密码、刷新消息队列、显示配置属性表或直接与提供程序确认状态的方法。 状态表信息还可用于生成对话框,以在长时间操作期间通知客户端进度。

支持状态表的服务提供商使用 IMAPISupport::ModifyStatusRow 方法创建和更新其行。 每当其行发生更改时,必须通知注册以接收状态表通知的所有建议接收器对象。 如果服务提供商使用的是 MAPI 通知实用工具,则可以调用 IMAPISupport::Notify 方法,或者直接调用每个建议接收器的 IMAPIAdviseSink::OnNotify 方法。

另请参阅

MAPI 表