IMAPIProp::OpenProperty

适用于:Outlook 2013 | Outlook 2016

返回指向可用于访问属性的接口的指针。

HRESULT OpenProperty(
  ULONG ulPropTag,
  LPCIID lpiid,
  ULONG ulInterfaceOptions,
  ULONG ulFlags,
  LPUNKNOWN FAR * lppUnk
);

参数

ulPropTag

[in]要访问的属性的属性标记。 标识符和类型都必须包含在属性标记中。

lpiid

[in]指向要用于访问 属性的接口的标识符的指针。 lpiid 参数不能为 null

ulInterfaceOptions

[in]与 lpiid 参数标识的接口相关的数据。

ulFlags

[in]控制对 属性的访问的标志的位掩码。 可以设置以下标志:

MAPI_CREATE

如果该属性不存在,则应创建它。 如果该属性确实存在,则应放弃该属性的当前值。 调用方设置MAPI_CREATE标志时,还应设置MAPI_MODIFY标志。

MAPI_DEFERRED_ERRORS

允许 OpenProperty 成功返回,可能是在对象对调用方完全可用之前。 如果该对象不可用,则进行后续对象调用可能会引发错误。

MAPI_MODIFY

在以下情况下,需要MAPI_MODIFY:

  • 打开流属性(如 IID_IStream)时,可对其进行修改。

  • 打开嵌入的邮件附件(例如 PR_ATTACH_DATA_OBJ 使用 IID_IMessage 打开)时,可对其进行修改。

lppUnk

[out]指向要用于属性访问的请求接口的指针。

返回值

S_OK

已成功返回请求的接口指针。

MAPI_E_INTERFACE_NOT_SUPPORTED

此属性不支持请求的接口。

MAPI_E_NO_ACCESS

调用方没有足够的权限来访问 属性。

MAPI_E_NO_SUPPORT

对象无法通过请求的接口提供对此属性的访问权限。

MAPI_E_NOT_FOUND

请求的属性不存在,并且未在 ulFlags 参数中设置MAPI_CREATE。

MAPI_E_INVALID_PARAMETER

标记中的属性类型设置为 PT_UNSPECIFIED。

备注

IMAPIProp::OpenProperty 方法通过特定接口提供对属性的访问。 OpenPropertyIMAPIProp::GetPropsIMAPIProp::SetProps 方法的替代方法。 当 GetPropsSetProps 因属性太大或太复杂而失败时,请调用 OpenPropertyOpenProperty 通常用于访问 PT_OBJECT 类型的属性。

给调用方的说明

若要访问邮件附件,请使用不同的接口标识符打开 PR_ATTACH_DATA_OBJ (PidTagAttachDataObject) 属性,具体取决于附件的类型。 下表介绍了如何为不同类型的附件调用 OpenProperty

附件类型 要使用的接口标识符
二进制
IID_IStream
String
IID_IStream
邮件
IID_IMessage
OLE 2.0
IID_IStreamDocfile

IStreamDocfile 是基于 OLE 2.0 复合文件的 IStream 接口的派生。 IStreamDocfile 是访问 OLE 2.0 附件的最佳选择,因为它涉及的开销最少。 可以将 IID_IStreamDocFile 用于包含存储在结构化存储中的数据的属性,这些属性可通过 IStorage 接口获得。

有关如何对附件使用 OpenProperty 的详细信息,请参阅 PR_ATTACH_DATA_OBJ 属性和 打开附件

请勿使用收到的 IStream 指针调用其 SeekSetSize 方法,除非使用零位置或大小变量。 此外,不要依赖于从 Seek 调用返回的 plibNewPosition 输出参数的值。

如果调用 OpenProperty 来访问具有 IStream 接口的属性,请仅使用该接口对其进行更改。 请勿尝试使用任何其他 IMAPIProp 更新属性:IUnknown 方法,例如 SetPropsIMAPIProp::D eleteProps

不要多次尝试使用 OpenProperty 打开属性。 结果未定义,因为它们可能因提供程序而异。

如果需要修改要打开的属性,请设置MAPI_MODIFY标志。 如果不确定对象是否支持 属性,但你认为它应该支持,请设置MAPI_CREATE并MAPI_MODIFY标志。 每当设置MAPI_CREATE时,还必须设置MAPI_MODIFY。

你负责将 lppUnk 参数中返回的接口指针重新转换为适用于 lpiid 参数中指定的接口的接口指针。 完成操作后,还必须使用返回的指针调用其 IUnknown::Release 方法。

有时,在 ulFlags 参数中设置标志不足以指示对所需属性的访问类型。 可以将其他数据(如标志)放在 ulInterfaceOptions 参数中。 此数据依赖于接口。 某些接口 ((如 IStream )) 使用它,而其他接口则不使用。 例如,打开要使用 IStream 修改的属性时,除了MAPI_MODIFY外,在 ulInterfaceOptions 参数中设置STGM_WRITE标志。 使用 IMAPITable 接口打开表时,可以将 ulInterfaceOptions 设置为 MAPI_UNICODE以指示表中保存字符串属性的列是否应采用 Unicode 格式。

MFCMAPI 引用

有关 MFCMAPI 示例代码,请参阅下表。

文件 函数 Comment
StreamEditor.cpp
CStreamEditor::ReadTextStreamFromProperty
MFCMAPI 使用 IMAPIProp::OpenProperty 方法检索大型文本和二进制属性的流接口。

另请参阅