Páginas de código e cadeias de caracteres Unicode
Outra consideração na implementação IPropertySetStorage é como os nomes de propriedade Unicode são armazenados no ID de propriedade 0 (o dicionário de nome de propriedade), que não usa cadeias de caracteres Unicode.
Unicode oficialmente tem um valor de página de código de 1200. Para armazenar valores Unicode no dicionário de nome de propriedade, use um valor de página de código de 1200 para todo o conjunto de propriedades (no ID de 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 um VT_LPSTR é uma contagem de bytes, não uma contagem de caracteres. Isso é necessário para fornecer compatibilidade com clientes de versões anteriores.
A implementação de arquivo composto do 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 grfFlags parâmetro de IPropertySetStorage::Create.
Crie e abra conjuntos de propriedades como Unicode. Para implementar isso, não defina o sinalizador PROPSETFLAG_ANSI no grfFlags parâmetro de IPropertySetStorage::Create. Evite usar valores VT_LPSTR e, em vez disso, use valores VT_LPWSTR. 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 o ID de propriedade 1 pode ser lido explicitamente para aprender a página de código.
Você pode acessar o ID de 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 não pode ser excluído com DeleteMultiple.