Páginas de código e cadeias de caracteres Unicode
Outra consideração na implementação de IPropertySetStorage é como os nomes de propriedade Unicode são armazenados na ID da propriedade 0 (o dicionário de nomes de propriedade), que não usa cadeias de caracteres Unicode.
O Unicode tem oficialmente um valor de página de código de 1200. Para armazenar valores Unicode no dicionário de nomes de propriedade, use um valor de página de código de 1200 para todo o conjunto de propriedades (na ID da propriedade 1), especificado pela ausência do sinalizador PROPSETFLAG_ANSI em IPropertySetStorage::Create. Lembre-se de que isso tem o efeito colateral de armazenar todos os valores de cadeia de caracteres na propriedade definida em Unicode. Em todas as páginas de código, a contagem encontrada no início de uma VT_LPSTR é uma contagem de bytes, não uma contagem de caracteres. Isso é necessário para fornecer compatibilidade com clientes de versão anterior.
A implementação de arquivo composto de IPropertySetStorage cria todos os novos conjuntos de propriedades completamente em Unicode (página de código 1200) ou na página de código ANSI do sistema atual. Isso é controlado pela ausência ou presença do sinalizador PROPSETFLAG_ANSI no parâmetro grfFlags de IPropertySetStorage::Create.
Crie e abra conjuntos de propriedades como Unicode. Para implementar isso, não defina o sinalizador PROPSETFLAG_ANSI no parâmetro grfFlags de IPropertySetStorage::Create. Evite usar VT_LPSTR valores e, em vez disso, use VT_LPWSTR valores. Quando a página de código do conjunto de propriedades é Unicode, VT_LPSTR valores de cadeia de caracteres são convertidos em Unicode quando armazenados e de volta para valores de cadeia de caracteres multibyte quando recuperados.
Definir o sinalizador PROPSETFLAG_ANSI conforme relatado por meio de uma chamada para IPropertyStorage::Stat reflete se a página de código subjacente é ou não Unicode. Lembre-se de que a ID da Propriedade 1 pode ser lida explicitamente para aprender a página de código.
Você pode acessar a ID da Propriedade 1 por meio de uma chamada para IPropertyStorage::ReadMultiple. No entanto, ele é somente leitura e pode não ser atualizado com WriteMultiple. Além disso, ele pode não ser excluído com DeleteMultiple.