Páginas de códigos y cadenas Unicode
Otra consideración en la implementación de IPropertySetStorage es cómo se almacenan los nombres de propiedad Unicode en el identificador de propiedad 0 (el diccionario de nombres de propiedad), que no usa cadenas Unicode.
Unicode tiene oficialmente un valor de página de códigos de 1200. Para almacenar valores Unicode en el diccionario de nombres de propiedad, use un valor de página de códigos de 1200 para todo el conjunto de propiedades (en el identificador de propiedad 1), especificado por la ausencia de la marca de PROPSETFLAG_ANSI en IPropertySetStorage::Create. Tenga en cuenta que esto tiene el efecto secundario de almacenar todos los valores de cadena en la propiedad establecida en Unicode. En todas las páginas de códigos, el recuento encontrado al principio de un VT_LPSTR es un recuento de bytes, no un recuento de caracteres. Esto es necesario para proporcionar compatibilidad con clientes de versiones anteriores.
La implementación de archivo compuesto de IPropertySetStorage crea todos los nuevos conjuntos de propiedades completamente en Unicode (página de códigos 1200) o en la página de códigos ANSI del sistema actual. Esto se controla mediante la ausencia o presencia de la marca PROPSETFLAG_ANSI en el parámetro grfFlags de IPropertySetStorage::Create.
Cree y abra los conjuntos de propiedades como Unicode. Para implementar esto, no establezca la marca PROPSETFLAG_ANSI en el parámetro grfFlags de IPropertySetStorage::Create. Evite usar VT_LPSTR valores y, en su lugar, use VT_LPWSTR valores. Cuando la página de códigos del conjunto de propiedades es Unicode, VT_LPSTR valores de cadena se convierten en Unicode cuando se almacenan y vuelven a valores de cadena multibyte cuando se recuperan.
Al establecer la marca de PROPSETFLAG_ANSI como se indica a través de una llamada a IPropertyStorage::Stat , se refleja si la página de códigos subyacente es o no Unicode. Tenga en cuenta que el id. de propiedad 1 se puede leer explícitamente para aprender la página de códigos.
Puede acceder al id. de propiedad 1 a través de una llamada a IPropertyStorage::ReadMultiple. Sin embargo, es de solo lectura y es posible que no se actualice con WriteMultiple. Además, es posible que no se elimine con DeleteMultiple.