使用会话访问对象

适用于:Outlook 2013 | Outlook 2016

从调用 MAPILogonEx 收到的会话指针可用于访问各种对象。 下表列出了用于访问各种对象的方法:

Object 会话方法
“配置文件”部分
IMAPISession::OpenProfileSection
消息存储
IMAPISession::OpenMsgStore
通讯簿
IMAPISession::OpenAddressBook
消息服务管理对象
IMAPISession::AdminServices
文件夹、邮件、通讯簿容器、通讯组列表或消息传送用户
IMAPISession::OpenEntry

使用 OpenEntry 方法和有效的条目标识符,可以打开任何通讯簿或消息存储提供程序对象。 除了 IMAPISession 方法外,MAPI 中还有其他 OpenEntry 方法。 OpenEntry 在以下对象中实现:

Object 方法
通讯簿提供程序的登录对象
IABLogon::OpenEntry
通讯簿
IAddrBook::OpenEntry
通讯簿容器
IMAPIContainer::OpenEntry
会话
IMAPISession::OpenEntry
消息存储
IMsgStore::OpenEntry
消息存储提供程序的登录对象
IMSLogon::OpenEntry
Folder
IMAPIContainer::OpenEntry
支持对象
IMAPISupport::OpenEntry

某些 OpenEntry 方法需要对象的入口标识符才能打开, IMAPISession::OpenEntry:其他方法允许指定 NULL。 NULL 条目标识符的解释方式因对象而异。 例如,使用 NULL 条目标识符调用 IAddrBook::OpenEntry 时,MAPI 会打开通讯簿的根容器。 消息存储的 OpenEntry 方法的行为类似;它将打开邮件存储的根文件夹。 由文件夹和通讯簿容器实现的 IMAPIContainer::OpenEntry 可能会返回MAPI_E_INVALID_PARAMETER或根容器,具体取决于实现者。

除了不允许输入标识符的 NULL 值外,会话的 OpenEntry 方法与其他 OpenEntry 方法不同,因为它的工作不是打开对象。 相反,它会检查条目标识符,并将调用转发到由相应服务提供商实现的另一个 OpenEntry 方法。 例如,如果使用消息的条目标识符调用 IMAPISession::OpenEntry ,则 MAPI 将调用负责消息的消息存储的 IMSLogon::OpenEntry 方法。

除了使用会话打开对象之外,客户端还使用它来比较对象。 IMAPISession::CompareEntryIDs 方法通过比较对象的条目标识符来比较对象。 如果条目标识符中包含的 MAPIUID 结构属于同一服务提供程序,则 MAPI 会将调用转发到该提供程序。 当两个条目标识符不匹配时,CompareEntryID 返回错误值。 尽管此方法可以比较属于任何类型的对象的条目标识符, 但 CompareEntryID 最适合用于更高级别的对象,例如消息存储和通讯簿容器。 若要比较较低级别的对象,请直接比较对象的搜索键 (PR_SEARCH_KEY (PidTagSearchKey) ) 或记录 (PR_RECORD_KEY (PidTagRecordKey) ) 。

OpenEntry 一样, CompareEntryID 由 多个对象实现。 根据你拥有的有关要打开或比较的对象的信息量,选择要使用的 OpenEntryCompareEntryID 方法。 在决定调用哪个接口方法时,请使用以下准则:

  • 如果没有有关目标对象的信息,请调用 IMAPISession::OpenEntryIMAPISession::CompareEntryIDs。 此方法允许访问任何对象,但这是三个对象中速度最慢的。

  • 如果知道目标对象是通讯簿条目而不是文件夹,请调用 IAddrBook::OpenEntryIAddrBook::CompareEntryIDs 方法。 当将 NULL 指定为目标对象时,IAddrBook::OpenEntry 将打开通讯簿的根容器。 此方法支持访问任何通讯簿对象,并且比使用 IMAPISession 更快,但比使用 IMAPIContainer 慢。

  • 如果使用的条目标识符是短期条目标识符,或者如果知道目标对象属于特定的通讯簿容器或文件夹,请调用 IMAPIContainer::OpenEntry 方法。 此方法可产生最快的性能,但仅允许访问特定容器或文件夹中的对象。