Udostępnij przez


Strony kodowe i ciągi Unicode

Innym zagadnieniem podczas implementowania IPropertySetStorage jest sposób przechowywania nazw właściwości Unicode w identyfikatorze właściwości 0 (słowniku nazw właściwości), który nie używa ciągów Unicode.

Unicode oficjalnie ma wartość strony kodowej 1200. Aby przechowywać wartości Unicode w słowniku nazw właściwości, użyj wartości strony kodowej 1200 dla całego zestawu właściwości (w identyfikatorze właściwości 1), określonego przez brak flagi PROPSETFLAG_ANSI w IPropertySetStorage::Create. Należy pamiętać, że ma to efekt uboczny przechowywania wszystkich wartości ciągów we właściwości ustawionej w formacie Unicode. Na wszystkich stronach kodu liczba znaleziona na początku VT_LPSTR jest liczbą bajtów, a nie liczbą znaków. Jest to konieczne, aby zapewnić zgodność ze starszymi wersjami klientów.

Implementacja pliku złożonego IPropertySetStorage tworzy wszystkie nowe zestawy właściwości całkowicie w formacie Unicode (strona kodowa 1200) lub na bieżącej stronie kodowej ANSI systemu. Jest to kontrolowane przez brak lub obecność flagi PROPSETFLAG_ANSI w grfFlags parametru IPropertySetStorage::Create.

Utwórz i otwórz zestawy właściwości jako Unicode. Aby to zaimplementować, nie należy ustawiać flagi PROPSETFLAG_ANSI w grfFlags parametru IPropertySetStorage::Create. Unikaj używania wartości VT_LPSTR, a zamiast tego użyj wartości VT_LPWSTR. Gdy strona kodowa zestawu właściwości to Unicode, VT_LPSTR wartości ciągów są konwertowane na Unicode podczas przechowywania i z powrotem do wielobajtowych wartości ciągów podczas pobierania.

Ustawienie flagi PROPSETFLAG_ANSI zgłoszonej za pomocą wywołania IPropertyStorage::Stat odzwierciedla, czy podstawowa strona kodowa jest lub nie jest Unicode. Należy pamiętać, że identyfikator właściwości 1 można jawnie odczytać, aby poznać stronę kodów.

Dostęp do właściwości o identyfikatorze 1 można uzyskać za pośrednictwem wywołania metody IPropertyStorage::ReadMultiple. Jednak jest on tylko do odczytu i może nie zostać zaktualizowany przy użyciu WriteMultiple. Ponadto nie można go usunąć za pomocą DeleteMultiple.