代码页和 Unicode 字符串

实现 IPropertySetStorage 的另一个注意事项是如何将 Unicode 属性名称存储在属性 ID 0 (属性名称字典) ,后者不使用 Unicode 字符串。

Unicode 的正式代码页值为 1200。 若要在属性名称字典中存储 Unicode 值,请将代码页值 1200 用于属性 ID 1) 中由 IPropertySetStorage::Create 中缺少 PROPSETFLAG_ANSI 标志所指定的整个属性集 (。 请注意,这具有将所有字符串值存储在 Unicode 中设置的属性中的副作用。 在所有代码页中, 在VT_LPSTR 开头找到的计数是字节计数,而不是字符计数。 这是提供与早期版本客户端兼容所必需的。

IPropertySetStorage 的复合文件实现完全在 Unicode (代码页 1200) 或当前系统 ANSI 代码页中创建所有新属性集。 这由 IPropertySetStorage::CreategrfFlags 参数中是否存在PROPSETFLAG_ANSI标志控制。

创建属性集并将其作为 Unicode 打开。 若要实现此操作,请不要在 IPropertySetStorage::CreategrfFlags 参数中设置 PROPSETFLAG_ANSI 标志。 避免使用 VT_LPSTR 值,改用 VT_LPWSTR 值。 当属性集的代码页为 Unicode 时, VT_LPSTR 字符串值在存储时转换为 Unicode,在检索时将转换为多字节字符串值。

设置通过调用 IPropertyStorage::Stat 报告PROPSETFLAG_ANSI标志将反映基础代码页是否为 Unicode。 请注意,可以显式读取属性 ID 1 来了解代码页。

可以通过调用 IPropertyStorage::ReadMultiple 来访问属性 ID 1。 但是,它是只读的,不能使用 WriteMultiple 进行更新。 此外,不能使用 DeleteMultiple 删除它。