Lire en anglais

Partager via


Dictionnaire de noms d’affichage du jeu de propriétés

Un dictionnaire de noms complets de propriétés permet aux utilisateurs du jeu de propriétés d’attacher une signification aux propriétés, au-delà de celles fournies par l’indicateur de type.

Structure du dictionnaire

Le dictionnaire contient un nombre d’entrées dans la liste, suivi d’une liste d’entrées de dictionnaire.

typedef struct tagDICTIONARY 
{ 
    DWORD  cEntries ;               // Count of entries in the list 
    ENTRY  rgEntry[ cEntries ] ;    // Property ID/String pair 
} DICTIONARY ;

Structure d’entrée de dictionnaire

Chaque entrée de dictionnaire dans la liste est une paire Identificateur de propriété/Chaîne. Voici une définition de pseudo-structure pour une entrée de dictionnaire. Il s’agit d’une pseudo-structure, car le membre sz[] est de taille variable.

typedef struct tagENTRY 
{ 
    DWORD  propid ;    // Property ID 
    DWORD  cch ;       // Count of characters in the string 
    char  sz[cch];     // Zero-terminated string 
} ENTRY ;

Exemple de dictionnaire

L’exemple de transfert de données boursières suivant peut inclure un nom affichable « Cotation boursière » pour l’ensemble et « Symbole de graduation » pour PID_SYMBOL. Si un jeu de propriétés ne contenait qu’un symbole et le dictionnaire, la section du jeu de propriétés aurait un flux d’octets semblable à ce qui suit.

Offset     Bytes 
; Start of section 
0000    5C 01 00 00    ; DWORD size of section 
0004    04 00 00 00    ; DWORD number of properties in section 
 
; Start of PropID/Offset pairs 
0008    01 00 00 00    ; DWORD Property ID (1 == code page) 
000C    28 00 00 00    ; DWORD offset to property ID 
0010    00 00 00 80    ; DWORD Property ID (0x80000000 == locale
                                                 ID) 
0014    30 00 00 00    ; DWORD offset to property ID 
0018    00 00 00 00    ; DWORD Property ID (0 == dictionary) 
001C    38 00 00 00    ; DWORD offset to property ID 
0020    07 00 00 00    ; DWORD Property ID (7 == PID_SYMBOL)
0024    5C 01 00 00    ; DWORD offset to property ID
 
; Start of Property 1 (code page)
0028    01 00 00 00    ; DWORD type indicator (VT_12)
002C    B0 04          ; USHORT codepage (0x04b0 == 1200 ==
                                                 unicode)
002E    00 00          ; Pad to 32-bit boundary
 
; Start of Property 0x80000000 (Local ID)
0030    13 00 00 00    ; DWORD type indicator (VT_U14)
0034    09 04 00 00    ; ULONG locale ID (0x0409 == American 
                                                 English)
 
; Start of Property 0 (the dictionary)
0038    08 00 00 00    ; DWORD number of entries in dictionary
                             (Note:  No type indicator)
003C    00 00 00 00    ; DWORD propid == 0 (the dictionary)
0040    0C 00 00 00    ; DWORD cch == wcslen(L"Stock Quote") +
                                                 sizeof(L'\0') == 12
0044    L"Stock Quote" ; wchar_t wsz(12)
005C    05 00 00 00    ; DWORD propid == 5 (PID_HIGH)
0060    0B 00 00 00    ; DWORD cch == wcslen(L"High Price") + 
                                                 sizeof(L'\0') == 11
0064    L"High Price\0"; wchar_t wsz(11)
007A    00 00          ; padding for 32-bit alignment (necessary
                             because the codepage is unicode)
007C    07 00 00 00    ; DWORD propid == 7 (PID_SYMBOL)
0080    0E 00 00 00    ; DWORD cch - wcslen(L"Ticker Symbol\0") 
                             == 14
0084    L"Ticker Symbol\0" ; wchar_t wsz(14)
 
    // The dictionary would continue, but may not contain entries 
    // for every possible property, and may contain entries for 
    // properties that are not present. Entries are not required  
    // to be in order.

Tenez compte des problèmes suivants concernant les dictionnaires d’ensembles de propriétés :

  • L’ID de propriété 0 n’a pas d’indicateur de type. Le type de données DWORD qui indique le nombre d’entrées se trouve à la position de l’indicateur de type.
  • Le nombre de caractères dans la chaîne cch inclut le caractère zéro qui termine la chaîne. Lorsque la page de code du jeu de propriétés n’est pas Unicode, ce champ est en fait un nombre d’octets . Pour les jeux de propriétés dont le format est 0, ce nombre ne peut pas dépasser 256. Pour les jeux de propriétés avec une version de format de 1, ce nombre peut être aussi élevé que ce qui est autorisé par la taille totale du jeu de propriétés.
  • Le dictionnaire est facultatif. Tous les noms des propriétés de l’ensemble ne sont pas obligatoires pour apparaître dans le dictionnaire. À l’inverse, tous les noms du dictionnaire ne sont pas requis pour correspondre aux propriétés de l’ensemble. Le dictionnaire doit omettre les entrées pour les propriétés supposées être reconnues universellement par les applications manipulant le jeu de propriétés. En règle générale, les noms des jeux de propriétés de base pour les normes largement acceptées sont omis, mais les jeux de propriétés à usage spécial peuvent inclure des dictionnaires à utiliser par les navigateurs.
  • Les noms de propriétés dans le dictionnaire sont stockés dans la page de codes indiquée par l’ID de propriété 1. Pour les pages de codes ANSI, chaque entrée de dictionnaire est alignée sur les octets. Par conséquent, il n’existe aucun espacement entre les noms de propriétés avec l’ID de propriété 0. Il s’agit du seul cas où les valeurs des types de données DWORD (l’ID de propriété et les DWORDde longueur du nom de la propriété) ne doivent pas nécessairement être alignées sur les limites 32 bits. Pour les pages Unicode, chaque entrée de dictionnaire est alignée sur 32 bits.
  • Les noms de propriétés qui commencent par les caractères Unicode binaires 0x0001 par 0x001F sont réservés pour une utilisation ultérieure.
  • Le nom de propriété associé à l’ID de propriété 0 représente le nom de l’ensemble du jeu de propriétés.