属性集显示名称字典

属性显示名称字典使属性集用户能够将含义附加到属性 - 超出类型指示器提供的属性。

字典结构

字典包含列表中的条目计数,后跟字典条目列表。

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 关联的属性名称表示整个属性集的名称。