保留属性标识符
保留属性标识符不能用作属性标识符(ID)。 除 0、1 和大于或等于的任何值之外,可以使用任何属性标识符(ID),0x80000000。 这些属性标识符值保留供应用程序使用。
下表列出了保留的属性 ID 和属性 ID 的保留说明。
保留的属性 ID | 描述 |
---|---|
0 | 保留用于创建可选 属性集显示名称字典。 这样,属性设置用户即可将含义附加到属性,超出类型指示器提供的属性。 |
1 | 保留为代码页(Windows)或脚本(Macintosh)的指示器,用于解释属性集中的字符串。 属性集中的所有字符串值都必须使用相同的代码页进行存储。 属性集标头(PROPERTYSETHEADER::d wOSVer)中的原始作系统值确定代码页指示器是对应于 Windows 代码页还是 Macintosh 脚本。 |
0x80000000 | 保留为属性集写入的区域设置的指示。 属性集的默认区域设置是系统默认区域设置(LOCALE_SYSTEM_DEFAULT)。 有关LOCALE_SYSTEM_DEFAULT的详细信息,请参阅 Win32 API。 当属性集中不存在区域设置指示器时,将使用默认值。 |
0x80000003 | 保留为属性集行为的指示器。 此属性 ID 值是一个VT_UI4,以 DWORD 数据类型开头,其中包含值VT_UI4后跟指示属性集行为的 DWORD。 目前,定义此值的唯一位是低序位(0x1)。 如果设置了此位,则表示属性集名称(由属性 ID 0 指示)应视为区分大小写。 如果未设置此位,或者行为属性(ID 0x80000003)不存在,则应将名称视为不区分大小写。 |
0xFFFFFFFF | 为方便编程而保留。 它不应出现在序列化的属性集中。 |
具有高位集(即负值)的属性标识符保留供Microsoft将来使用。
在保留属性中,那些在范围中具有 ID 值0x80000000 0xBFFFFFFF的实现被视为只读的,这些实现不理解其含义。 例如,如果实现不了解属性0x80000000的含义,则应允许读取该属性,但不允许写入或删除该属性。 此类实现应允许区域中的属性0xC0000000 0xFFFFFFFE读取、写入或删除。 属性 ID 0xFFFFFFFF是保留值,不应出现在序列化的属性集中。
属性集区域设置
应用程序可以选择支持区域设置或使用默认行为。 建议应用程序允许用户指定工作区域设置。 此类应用程序应将用户指定的区域设置标识符写入属性。 使用用户默认区域设置(LOCALE_USER_DEFAULT)的应用程序应将用户默认区域设置标识符写入属性。 有关LOCALE_USER_DEFAULT的详细信息,请参阅 Win32 API。
注意
如果使用 IPropertySetStorage 接口创建属性集,则用户默认区域设置将自动写入为区域设置指示器。
应用程序还应处理外部对象的情况,即区域设置不是应用程序区域设置、用户区域设置或系统区域设置的情况。
区域设置指示器属性的类型为 VT_U14,因此由包含VT_U14的 DWORD 组成,后跟包含区域设置标识符(LCID)的 DWORD,如 Win32 API 中定义。
代码页指示器
当不是属性集作者的应用程序更改集中字符串类型的属性时,它应检查代码页指示器并执行以下作之一:
- 以代码页指示器指定的格式编写字符串。
- 替换和重写以更改代码页。
如果应用程序无法识别此指示器,则它不应修改该属性。 属性集的所有创建者都必须编写代码页指示器;但是,如果代码页指示器不存在,则必须假定读取器计算机上的占位代码页。
注意
如果使用 IPropertySetStorage 接口来创建属性集,则会自动编写代码页指示器。
Win32 API 中提供了代码页的可能值(有关详细信息,请参阅 GetACP 函数),并在 Macintosh Volume VI 中页 14-111。 (某些语言和国家/地区可能不提供这些资源。例如,代码页 US ANSI 由 0x04E4(1252 以十进制为单位)表示,而 Unicode 的代码页0x04B0(1200 以十进制为单位)。
建议尽可能使用 Unicode 代码页,并使用 VT_LPWSTR 而不是 VT_LPSTR 以避免多字节 <- 在存储和检索期间> Unicode 转换。 对所有属性集使用相同的代码页是实现全球可互作属性集的唯一方法。 在 Unicode 或非 Unicode 代码页中,请注意,VT_LPSTR或VT_BSTR开头的计数是 字节 计数,而不是 字符 计数。 此字节计数包括字符串末尾的一个或两个零字节(字符串的 NULL 终止符)。
属性 ID 1 是一种VT_I2类型,以 DWORD 开头,其中包含值VT_I2后跟指示代码页的 SHORT。