Кодовые страницы и строки Юникода
Еще одним соображением при реализации IPropertySetStorage является то, как имена свойств Юникода хранятся в свойстве с идентификатором 0 (словаре имен свойств), в котором не используются строки Юникода.
Юникод официально имеет значение кодовой страницы 1200. Чтобы сохранить значения Юникода в словаре имен свойств, используйте значение кодовой страницы 1200 для всего набора свойств (в свойстве с идентификатором 1), указанное отсутствием флага PROPSETFLAG_ANSI в IPropertySetStorage::Create. Имейте в виду, что это имеет побочный эффект сохранения всех строковых значений в свойстве, заданном в Юникоде. На всех кодовых страницах число, обнаруженное в начале VT_LPSTR является числом байтов, а не числом символов. Это необходимо для обеспечения совместимости с клиентами более ранних версий.
Реализация составного файла IPropertySetStorage полностью создает все новые наборы свойств либо в Юникоде (кодовая страница 1200), либо на текущей системной кодовой странице ANSI. Это управляется отсутствием или наличием флага PROPSETFLAG_ANSI в параметре grfFlagsобъекта IPropertySetStorage::Create.
Создание и открытие наборов свойств в юникоде. Чтобы реализовать это, не устанавливайте флаг PROPSETFLAG_ANSI в параметре grfFlagsобъекта IPropertySetStorage::Create. Избегайте использования VT_LPSTR значений и вместо этого используйте VT_LPWSTR значения. Если кодовая страница набора свойств имеет значение Юникод, VT_LPSTR строковые значения преобразуются в Юникод при хранении и обратно в многобайтовые строковые значения при извлечении.
Установка флага PROPSETFLAG_ANSI , о чем сообщается при вызове метода IPropertyStorage::Stat , отражает, является ли базовая кодовая страница юникодом или не является. Имейте в виду, что свойство с идентификатором 1 можно явно прочитать для изучения кодовой страницы.
Получить доступ к свойству с идентификатором 1 можно с помощью вызова метода IPropertyStorage::ReadMultiple. Однако он доступен только для чтения и может не обновляться с помощью WriteMultiple. Кроме того, его нельзя удалить с помощью DeleteMultiple.