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 方法通过特定接口提供对属性的访问。 OpenProperty 是 IMAPIProp::GetProps 和 IMAPIProp::SetProps 方法的替代方法。 当 GetProps 或 SetProps 因属性太大或太复杂而失败时,请调用 OpenProperty。 OpenProperty 通常用于访问 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 指针调用其 Seek 或 SetSize 方法,除非使用零位置或大小变量。 此外,不要依赖于从 Seek 调用返回的 plibNewPosition 输出参数的值。
如果调用 OpenProperty 来访问具有 IStream 接口的属性,请仅使用该接口对其进行更改。 请勿尝试使用任何其他 IMAPIProp 更新属性:IUnknown 方法,例如 SetProps 或 IMAPIProp::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 方法检索大型文本和二进制属性的流接口。 |