属性集序列化

属性集序列化格式有两个版本。 原始规范描述了格式的版本 0。 有关详细信息,请参阅 格式版本。 版本 1 扩展原始版本。 所有版本 0 属性集都作为版本 1 属性集有效。 序列化属性集标头中的 格式版本 字段指示版本。

以下项标识版本 0 和版本 1 属性集序列化格式之间的差异。

  • 支持新的 VARTYPE 值。 有关 VARTYPE 值及其用法的详细信息,请参阅主题 IDispatch 数据类型和结构 以及 PROPVARIANT 结构。

    版本 0 属性集中不支持以下 VARTYPE 值,但在版本 1 中受支持:

    VT_I1

    VT_VECTOR |VT_I1

    VT_INT

    VT_UINT

    VT_DECIMAL

    此外,可以在属性集中序列化 SafeArrays。 SafeArray 的存在由使用 OR作的VT_ARRAY位与 PROPVARIANT 结构的 vt 成员中的数组元素进行组合表示。 例如,4 字节带符号整数的 SafeArray 具有VT_ARRAY类型 |VT_I4。

    以下元素类型对于序列化属性集中的 SafeArray 有效:

           
    VT_I1 VT_UI1 VT_I2 VT_UI2
    VT_I4 VT_UI4 VT_INT VT_UINT
    VT_R4 VT_R8 VT_CY VT_DATE
    VT_BSTR VT_BOOL VT_DECIMAL VT_ERROR
    VT_VARIANT      
         

    指定VT_VARIANT数据类型时,它指示 SafeArray 本身保存 PROPVARIANT 结构。 这些元素的类型必须来自前面的列表,但不能包含嵌套VT_VARIANT类型。

    请注意,IPropertyStorage 的实现必须能够正常恢复,方法是在遇到新类型时返回错误;例如 VARENUM 类型。

  • 区分大小写的属性名称。 属性名称(例如在 IPropertyStorage::WritePropertyNames 方法中指定的名称)在版本 0 属性集中不区分大小写。 在版本 1 属性集中,属性名称可以区分大小写,具体取决于新的 Behavior 属性的值。

    Behavior 属性 具有VT_UI4类型的属性 ID 0x80000003。 如果设置了此值的最低位,则属性集名称区分大小写。 在 IPropertySetStorage::Create 方法的 grfFlags 参数中设置PROPSETFLAG_CASE_SENSITIVE标志,以指定区分大小写的属性集。

  • 长属性名称。 版本 0 属性集的属性名称必须小于或等于 256 个字符,包括 Unicode 代码页中的属性集的字符串终止符。 如果未在 Unicode 代码页中,它们必须小于 256 字节。 另一方面,版本 1 属性集可以具有无限长度的属性名称,尽管它们仍受 256 KB 的总属性集大小限制的限制。

建议默认创建和维护版本 0 属性集 IPropertyStorage 的实现。 如果调用方随后请求特定于版本 1 格式的功能,则只有更新属性集的版本。 例如,如果写入VT_ARRAY类型的属性或写入长属性名称,则实现应将属性集格式更新为版本 1。 如果在调用 IPropertySetStorage::Create中指定了PROPSETFLAG_CASE_SENSITIVE枚举值,则会出现此准则的一个例外。 在这种情况下,必须将属性集创建为版本 1 属性集。