Pagine codici e stringhe Unicode
Un'altra considerazione nell'implementazione di IPropertySetStorage è il modo in cui i nomi delle proprietà Unicode vengono archiviati nell'ID proprietà 0 (dizionario nome proprietà), che non usa stringhe Unicode.
Unicode ha ufficialmente un valore di tabella codici pari a 1200. Per archiviare i valori Unicode nel dizionario dei nomi delle proprietà, usare un valore della tabella codici pari a 1200 per l'intero set di proprietà (nell'ID proprietà 1), specificato dall'assenza del flag PROPSETFLAG_ANSI in IPropertySetStorage::Create. Tenere presente che questo ha l'effetto collaterale dell'archiviazione di tutti i valori stringa nella proprietà impostata in Unicode. In tutte le pagine codici il conteggio trovato all'inizio di un VT_LPSTR è un conteggio di byte, non un conteggio dei caratteri. Ciò è necessario per garantire la compatibilità con i client della versione precedente.
L'implementazione composta del file di IPropertySetStorage crea tutti i nuovi set di proprietà completamente in Unicode (tabella codici 1200) o nella tabella codici ANSI del sistema corrente. Questo è controllato dall'assenza o dalla presenza del flag di PROPSETFLAG_ANSI nel parametro grfFlags di IPropertySetStorage::Create.
Creare e aprire set di proprietà come Unicode. Per implementare questa operazione, non impostare il flag di PROPSETFLAG_ANSI nel parametro grfFlags di IPropertySetStorage::Create. Evitare di usare valori VT_LPSTR e usare invece valori VT_LPWSTR . Quando la tabella codici del set di proprietà è Unicode, VT_LPSTR i valori stringa vengono convertiti in Unicode quando archiviati e tornano a valori di stringa multibyte quando vengono recuperati.
L'impostazione del flag PROPSETFLAG_ANSI come segnalato tramite una chiamata a IPropertyStorage::Stat riflette se la tabella codici sottostante è o meno Unicode. Tenere presente che l'ID proprietà 1 può essere letto in modo esplicito per apprendere la tabella codici.
È possibile accedere all'ID proprietà 1 tramite una chiamata a IPropertyStorage::ReadMultiple. Tuttavia, è di sola lettura e potrebbe non essere aggiornato con WriteMultiple. Inoltre, potrebbe non essere eliminato con DeleteMultiple.