IMAPIProp::SetProps
适用于:Outlook 2013 | Outlook 2016
汇报一个或多个属性。
HRESULT SetProps(
ULONG cValues,
LPSPropValue lpPropArray,
LPSPropProblemArray FAR * lppProblems
);
参数
cValues
[in] lpPropArray 参数指向的属性值计数。 cValues 参数不能为 0。
lpPropArray
[in]指向包含要更新的属性值 的 SPropValue 结构的数组的指针。
lppProblems
[in,out]输入时,指向 指向 SPropProblemArray 结构的指针的指针;否则为 NULL,指示不需要错误信息。 如果 lppProblems 是输入上的有效指针, 则 SetProps 将返回有关更新一个或多个属性时出现的错误的详细信息。
返回值
S_OK
已成功更新属性。
以下值可以在 SPropProblemArray 结构中返回,但不能作为 SetProps 的返回值:
MAPI_E_BAD_CHARWIDTH
已设置MAPI_UNICODE标志且实现不支持 Unicode,或者未设置MAPI_UNICODE且实现仅支持 Unicode。
MAPI_E_COMPUTED
属性无法更新,因为它是只读的,由负责 对象的服务提供程序计算。
MAPI_E_INVALID_TYPE
属性类型无效。
MAPI_E_NO_ACCESS
尝试修改只读对象或访问用户权限不足的对象。
MAPI_E_NOT_ENOUGH_MEMORY
无法更新 属性,因为它大于远程过程调用 (RPC) 缓冲区大小。
MAPI_E_UNEXPECTED_TYPE
属性类型不是调用实现所需的类型。
针对实现者的说明
忽略 PR_NULL (PidTagNull) 属性标记以及类型 为 PT_ERROR 的所有属性。 不要在 SPropProblemArray 结构中进行更改或报告问题。
如果属性值数组中包含 类型为 PT_OBJECT 的属性,则返回MAPI_E_INVALID_PARAMETER。 如果数组中包含多值属性,并且其 cValues 成员设置为 0,则还会返回此错误。
如果调用总体成功,但设置某些属性时出现问题,请返回S_OK,并将有关问题的信息放在 lppProblems 参数指向的 SPropProblemArray 结构的相应条目中。
给调用方的说明
根据服务提供程序,还可以通过传递一个属性标记来更改属性类型,该标记包含与以前用于给定属性标识符的类型不同的类型。
如果为对象不支持的属性添加属性标记,并且 SetProps 的实现允许创建新属性,则会将 属性添加到 对象。 将放弃使用用于新属性的属性标识符存储的任何先前值。
请注意,S_OK返回值并不保证所有属性都已成功更新。 某些提供程序缓存 SetProps 调用,直到收到需要提供程序干预的调用,例如 IMAPIProp::SaveChanges 或 IMAPIProp::GetProps。 因此,可以接收与 SetProps 调用相关的错误值以及后续调用。
如果 SetProps 返回S_OK,检查 lppProblems 指向的 SPropProblemArray 结构,以查找更新单个属性时出现的问题。 如果 SetProps 返回错误,请不要检查属性问题数组。 请改为调用对象的 IMAPIProp::GetLastError 方法。
更新大型属性时, SetProps 可能会失败并返回MAPI_E_NOT_ENOUGH_MEMORY。 属性没有最大大小,不同的对象可以有不同的限制。 如果处理可能较大的属性,请准备好在 SetProps 返回此错误值时调用 IMAPIProp::OpenProperty 方法,并将 IID_IStream 作为接口标识符。
调用 MAPIFreeBuffer 函数以释放 SPropProblemArray 结构。
MFCMAPI 引用
有关 MFCMAPI 示例代码,请参阅下表。
文件 | 函数 | Comment |
---|---|---|
PropertyEditor.cpp |
CPropertyEditor::WriteSPropValueToObject |
编辑属性后,MFCMAPI 使用 IMAPIProp::SetProps 方法将属性写回到对象。 |