属性集序列化

属性集序列化格式有两个版本。 原始规范描述了格式的版本 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 属性是 属性 ID 0x80000003 ,类型为 VT_UI4。 如果设置了此值的最低位,则属性集名称区分大小写。 在 IPropertySetStorage::Create 方法的 grfFlags 参数中设置PROPSETFLAG_CASE_SENSITIVE标志,以指定区分大小写的属性集。

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

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