Codepages und Unicode-Zeichenfolgen
Ein weiterer Aspekt bei der Implementierung von IPropertySetStorage ist, wie Unicode-Eigenschaftsnamen in der Eigenschafts-ID 0 (dem Eigenschaftennamenverzeichnis) gespeichert werden, die keine Unicode-Zeichenfolgen verwendet.
Unicode hat offiziell den Codepagewert 1200. Verwenden Sie zum Speichern von Unicode-Werten im Eigenschaftennamenwörterbuch den Codepagewert 1200 für den gesamten Eigenschaftensatz (in Eigenschafts-ID 1), der durch das Fehlen des PROPSETFLAG_ANSI-Flags in IPropertySetStorage::Create angegeben wird. Beachten Sie, dass dies den Nebeneffekt hat, dass alle Zeichenfolgenwerte in der in Unicode festgelegten Eigenschaft gespeichert werden. Auf allen Codepages ist die Anzahl, die am Anfang einer VT_LPSTR gefunden wird, eine Byteanzahl, keine Zeichenanzahl. Dies ist erforderlich, um die Kompatibilität mit Clients früherer Versionen zu gewährleisten.
Die Verbunddateiimplementierung von IPropertySetStorage erstellt alle neuen Eigenschaftssätze vollständig entweder in Unicode (Codepage 1200) oder in der aktuellen SYSTEM-ANSI-Codepage. Dies wird durch das Fehlen oder Vorhandensein des PROPSETFLAG_ANSI-Flags im grfFlags-Parameter von IPropertySetStorage::Create gesteuert.
Erstellen und öffnen Sie Eigenschaftssätze als Unicode. Um dies zu implementieren, legen Sie nicht das flag PROPSETFLAG_ANSI im grfFlags-Parameter von IPropertySetStorage::Create fest. Vermeiden Sie die Verwendung von VT_LPSTR-Werten , und verwenden Sie stattdessen VT_LPWSTR Werte. Wenn die Codepage des Eigenschaftensatzes Unicode ist, werden VT_LPSTR Zeichenfolgenwerte beim Speichern in Unicode und beim Abrufen wieder in Multibyte-Zeichenfolgenwerte konvertiert.
Das Festlegen des PROPSETFLAG_ANSI Flags, das über einen Aufruf von IPropertyStorage::Stat gemeldet wird, gibt an, ob die zugrunde liegende Codepage Unicode ist oder nicht. Beachten Sie, dass die Eigenschafts-ID 1 explizit gelesen werden kann, um die Codepage zu erlernen.
Sie können über einen Aufruf von IPropertyStorage::ReadMultiple auf Eigenschafts-ID 1 zugreifen. Es ist jedoch schreibgeschützt und kann nicht mit WriteMultiple aktualisiert werden. Darüber hinaus darf es nicht mit DeleteMultiple gelöscht werden.