Словарь отображаемых имен набора свойств
Словарь отображаемых имен свойств позволяет пользователям набора свойств прикреплять значение к свойствам, помимо тех, которые предоставляются индикатором типа.
Структура словаря
Словарь содержит количество записей в списке, за которым следует список записей словаря.
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 ;
Пример словаря
Следующий пример передачи данных фондового рынка может включать отображаемое имя "Stock Quote" для всего набора и "Ticker Symbol" для 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 (идентификатор свойства и длина DWORD) не требуется выравнивать по 32-разрядным границам. Для страниц Юникода каждая запись словаря выравнивается по 32-разрядному формату.
- Имена свойств, которые начинаются с двоичных символов Юникода 0x0001 через 0x001F, зарезервированы для использования в будущем.
- Имя свойства, связанное с идентификатором свойства 0, представляет имя всего набора свойств.