状态对象实现
适用于:Outlook 2013 | Outlook 2016
所有服务提供程序都必须实现状态对象,并将属性从该对象提供给会话状态表。 可以在状态表中包括一行或多行,具体取决于所控制的资源数。 例如,传输提供程序应在状态表中为其管理的每个消息队列创建一行。 发生更改时,必须更新相应的状态表行。 实现状态对象旨在提供对状态表中包含的信息和未包含在表中的其他信息的访问权限。
实现状态对象
实现登录对象的 OpenStatusEntry 方法。 当客户端想要打开状态对象时,它们调用 IMAPISession::OpenEntry。 MAPI 通过调用提供程序的 OpenStatusEntry 方法来满足打开请求,导致提供程序打开其状态对象,并向客户端返回指向其 IMAPIStatus 实现的指针。 在 OpenStatusEntry 实现中,完成以下步骤:
如果登录对象尚未创建状态对象,请执行以下任务:
调用支持对象的 IMAPISupport::OpenProfileSection 方法来访问提供程序的配置文件部分。
创建新的状态对象。
将对配置文件部分的引用存储在提供程序的状态对象中,并调用配置文件部分的 IUnknown::AddRef 方法来增加其引用计数。
将对登录对象的引用存储在提供程序的状态对象中,并调用登录对象的 IUnknown::AddRef 方法以递增其引用计数。
将对状态对象的引用存储在提供程序的登录对象中。
调用 status 对象的 IUnknown::AddRef 方法以递增其在登录对象中的引用计数。
将 status 对象的 PR_OBJECT_TYPE (PidTagObjectType) 属性设置为 MAPI_STATUS。
将 lppMAPIStatus 输出参数设置为指向状态对象并返回 。
检查 ulFlags 输入参数。 如果它设置为 MAPI_MODIFY并且提供程序支持对其状态对象进行读/写访问,则返回可写对象。 但是,如果提供程序不支持对其状态对象进行读/写访问,请不要失败。 返回只读状态对象。 预期接收读/写状态对象的客户端应在尝试进行任何更改之前验证是否已授予读/写权限。
设置所有必需的状态对象和状态表属性。 状态表行中包含的属性应通过状态对象提供,MAPI 计算的属性除外。 所需属性如下所示:
PR_DISPLAY_NAME (PidTagDisplayName)
PR_PROVIDER_DLL_NAME (PidTagProviderDllName)
PR_PROVIDER_DISPLAY (PidTagProviderDisplay)
PR_RESOURCE_TYPE (PidTagResourceType)
PR_RESOURCE_METHODS (PidTagResourceMethods)
PR_RESOURCE_FLAGS (PidTagResourceFlags)
PR_STATUS_CODE (PidTagStatusCode)
实现适用于提供程序的 IMAPIStatus :IMAPIProp 方法。 根据提供程序,无需在 IMAPIStatus 中实现所有四种方法。 每个提供程序都应实现 IMAPIProp : IUnknown 接口和 IMAPIStatus::ValidateState 方法的只读版本。
传输提供程序还应实现 IMAPIStatus::FlushQueues,并且所有提供程序都应支持 IMAPIStatus::SettingsDialog。 但是,支持 IMAPIStatus::ChangePassword 是可选的。 只有需要密码并希望允许用户以编程方式更改密码的服务提供商才需要实现此方法。 对于支持的每个方法,请在 PR_RESOURCE_METHODS 属性中设置相应的位。 例如,如果仅支持 ValidateState 和 SettingsDialog , 请将PR_RESOURCE_METHODS 设置为以下内容:
STATUS_VALIDATE_STATE | STATUS_SETTINGS_DIALOG
在尝试调用状态对象之前,客户端应检查 PR_RESOURCE_METHODS 的值。 通过返回MAPI_E_NO_SUPPORT来处理对任何不受支持的方法的调用。
在登录期间调用 IMAPISupport::ModifyStatusRow ,将行或行添加到状态表中。 传递一个属性值数组,该数组包含行的列信息,为 ulFlags 参数传递 0。 如果在会话稍后的某个时间点,提供程序的状态发生更改,并且需要更新列信息,请再次调用 ModifyStatusRow 并设置STATUSROW_UPDATE标志。
有关状态对象的详细信息,请参阅 MAPI 状态对象。