属性集显示名称字典
属性显示名称字典使属性集用户能够将含义附加到属性 - 超出类型指示器提供的属性。
字典结构
字典包含列表中的条目计数,后跟字典条目列表。
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.
请注意有关属性集字典的以下问题:
- 属性 ID 0 没有类型指示器。 指示条目计数的 DWORD 数据类型位于类型指示器位置。
- cch 字符串中的字符计数包括终止字符串的零字符。 当属性集的代码页不是 Unicode 时,此字段实际上是 字节 计数。 对于格式版本为 0 的属性集,此计数不能超过 256。 对于格式版本为 1 的属性集,此计数可能与总属性集大小允许的大小一样大。
- 字典是可选的。 并非集合中的所有属性名称都需要显示在字典中。 相反,并非字典中的所有名称都需要对应于集中的属性。 字典应省略假定由操作属性集的应用程序普遍识别的属性条目。 通常,将省略广泛接受标准的基本属性集的名称,但特殊用途属性集可能包含供浏览器使用的字典。
- 字典中的属性名称存储在 属性 ID 1 指示的代码页中。 对于 ANSI 代码页,每个字典条目都是字节对齐的。 因此,属性 ID 为 0 的属性名称之间没有间距。 唯一的情况是 ,DWORD 数据类型的值 (属性 ID 和属性名称长度 DWORDs) 不需要在 32 位边界上对齐。 对于 Unicode 页面,每个字典条目都是 32 位对齐的。
- 以 0x001F 0x0001二进制 Unicode 字符开头的属性名称保留供将来使用。
- 与属性 ID 0 关联的属性名称表示整个属性集的名称。