检索 MAPI 属性

适用于:Outlook 2013 | Outlook 2016

当客户端或服务提供程序从对象检索属性时,该对象会提供该属性的值、类型和标识符。

客户端和服务提供商可以通过调用以下选项之一来检索对象的属性:

IMAPIProp::GetProps

IMAPIProp::OpenProperty

HrGetOneProp

GetProps 方法用于检索一个或多个不需要专用接口或备用接口进行访问的属性。 这意味着 GetProps 可用的属性很小,例如整数和布尔值。

检索多个属性

  1. 分配足够大的 SPropTagArray 结构,以容纳要检索的属性数。

  2. SPropTagArray 结构的 cValues 成员设置为要检索的属性数,并将每个 aulPropTag 成员设置为目标属性之一的标识符和类型(如果可能)。 如果类型未知,请将其设置为 PT_UNSPECIFIED。 如果类型和标识符都未知,请通过调用 IMAPIProp::GetPropList 找到此信息。 GetPropList 返回一个属性标记数组,其中包含对象的所有支持属性。 如果只有属性名称可用,请调用 IMAPIProp::GetIDsFromNames 来访问关联的标识符。

  3. 调用 IMAPIProp::GetProps 以打开一个或多个属性。

OpenProperty 方法用于打开需要备用接口(如 IStreamIMAPITable)才能访问的较大属性。 OpenProperty 通常用于打开大型字符串、二进制和对象属性,并且一次只能打开一个属性。 调用方传入作为输入参数之一所需的附加接口的标识符。

OpenProperty 的一些常见用途包括打开 PR_BODY (PidTagBody) , 用于保存基于文本的邮件正文的属性,PR_ATTACH_DATA_OBJ (PidTagAttachDataObject) 、保存 OLE 对象或邮件附件的属性,以及PR_CONTAINER_CONTENTS (PidTagContainerContents) ,该属性保存文件夹或通讯簿容器内容表。

根据 属性,从 OpenProperty 请求不同的接口。 IStream 是一个接口,允许以字节流的形式读取和写入属性数据,通常用于访问 PR_BODYIMessageIStream 可用于访问PR_ATTACH_DATA_OBJ。 标准消息的嵌入邮件附件使用 IMessage ,而 TNEF 格式的邮件使用 IStream。 由于 PR_CONTAINER_CONTENTS 是表对象,因此可通过 IMAPITable 对其进行访问。

检索附件的 PR_ATTACH_DATA_BIN 属性

  1. 调用 OpenStreamOnFile 函数以打开文件的流。

  2. 调用消息的 IMAPIProp::OpenProperty 方法,以使用 IStream 接口检索PR_ATTACH_DATA_BIN (PidTagAttachDataBinary) 属性。 设置MAPI_MODIFY标志和MAPI_CREATE标志。

  3. 分配 STATSTG 结构,并在调用文件流的 IStream::Stat 方法时将其传递,以确定其大小。 确定流大小的另一种方法是使用标志STREAM_SEEK_END调用 IStream::Seek

  4. 调用流的 IStream::CopyTo 方法,将数据从文件的流复制到附件流中。

  5. 复制操作完成后,通过调用其 IUnknown::Release 方法释放这两个流。

IStream 用于属性访问时,某些服务提供商会自动将属性的大小与流一起发送回来。 使用 MAPI_DEFERRED_ERRORS 标志调用 OpenProperty 可能会延迟属性的打开和流大小的返回。 如果在设置了 MAPI_DEFERRED_ERRORS 标志的 OpenProperty 之后调用 IStream::Stat 来检索此大小,则性能将受到影响,因为此调用序列会强制执行额外的远程过程调用。 为了避免性能下降,客户端可以在 对 OpenPropertyStat 的调用之间调用任何 MAPI 方法。

HrGetOneProp 函数(如 OpenProperty)一次打开一个属性。 仅当目标对象存在于本地计算机上时,才应使用 HrGetOneProp。 当目标对象在本地不可用时,反复使用 HrGetOneProp 可能会导致多个远程过程调用和性能下降。

需要多个属性的调用方可以在循环中调用 HrGetOnePropOpenProperty ,或者对 GetProps 进行一次调用。 调用 GetProps 一次会更高效。

注意

GetProps、HrGetOnePropGetPropList 调用中的其他属性不会自动提供安全属性。 必须使用其属性标识符显式请求安全属性。

另请参阅

MAPI 属性概述