Поделиться через


Словарь отображаемого имени набора свойств

Словарь отображаемых имен свойств позволяет пользователям устанавливать значение к свойствам , помимо указанных индикатором типа.

Структура словаря

Словарь содержит количество записей в списке, за которым следует список записей словаря.

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

Структура записи словаря

Каждая запись словаря в списке — это пара "Идентификатор свойства" или "Строка". Ниже приведено определение псевдоструктуры для записи словаря. Это псевдоструктура, так как член sz[] имеет размер переменной.

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

Пример словаря

Следующий пример передачи данных на фондовом рынке может включать отображаемое имя "Фондовая цитата" для всего набора и "Тикер символ" для PID_SYMBOL. Если набор свойств содержал только символ и словарь, раздел набора свойств будет иметь поток байтов, который выглядел следующим образом.

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.

Помните о следующих проблемах, связанных с словарями наборов свойств:

  • Идентификатор свойства 0 не имеет индикатора типа. Тип данных DWORD, указывающий количество записей в позиции индикатора типа.
  • Количество символов в строке cch включает нулевой символ, завершающий строку. Если кодовая страница набора свойств не является Юникодом, это поле фактически является числом байтов. Для наборов свойств с версией формата 0 это число не может превышать 256. Для наборов свойств с версией формата 1 это число может быть таким большим, как разрешено общим размером набора свойств.
  • Словарь необязателен. Не все имена свойств в наборе должны отображаться в словаре. И наоборот, для соответствия свойствам в наборе требуются не все имена в словаре. Словарь должен пропускать записи, которые предполагается, что свойства должны быть универсально распознаны приложениями, манипулятивными набором свойств. Как правило, имена наборов базовых свойств для широко принятых стандартов опущены, но наборы свойств специального назначения могут включать словари для использования браузерами.
  • Имена свойств в словаре хранятся на кодовой странице, указанной идентификатором свойства 1. Для кодовых страниц ANSI каждая запись словаря выровнена по байтам. Таким образом, между именами свойств нет интервала с идентификатором свойства 0. Это единственный случай, когда значения типа данных DWORD (идентификатор свойства и длина имени свойства DWORDs) не требуются для выравнивания по 32-разрядным границам. Для страниц Юникода каждая запись словаря имеет 32-разрядную выравнивание.
  • Имена свойств, начинающиеся с двоичных символов Юникода, 0x0001 через 0x001F зарезервированы для дальнейшего использования.
  • Имя свойства, связанное с идентификатором свойства 0, представляет имя всего набора свойств.