속성 집합 표시 이름 사전
속성 표시 이름의 사전을 사용하면 속성 집합 사용자가 형식 표시기에서 제공하는 것 이상으로 속성에 의미를 연결할 수 있습니다.
사전 구조
사전에는 목록의 항목 개수와 사전 항목 목록이 포함됩니다.
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"와 PID_SYMBOL "Ticker 기호"가 포함될 수 있습니다. 속성 집합에 기호와 사전만 포함된 경우 속성 집합 섹션에는 다음과 같은 바이트 스트림이 있습니다.
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 문자열의 문자 수에는 문자열을 종료하는 0개의 문자가 포함됩니다. 속성 집합의 코드 페이지가 유니코드가 아닌 경우 이 필드는 실제로 바이트 수입니다. 형식 버전이 0인 속성 집합의 경우 이 개수는 256을 초과하지 않을 수 있습니다. 형식 버전이 1인 속성 집합의 경우 이 개수는 총 속성 집합 크기에서 허용하는 만큼 클 수 있습니다.
- 사전은 선택 사항입니다. 집합에 있는 속성의 모든 이름이 사전에 나타나야 하는 것은 아닙니다. 반대로, 집합의 속성에 해당하기 위해 사전의 모든 이름이 필요한 것은 아닙니다. 사전은 속성 집합을 조작하는 애플리케이션에서 범용으로 인식되는 것으로 간주되는 속성에 대한 항목을 생략해야 합니다. 일반적으로 널리 허용되는 표준에 대한 기본 속성 집합의 이름은 생략되지만 특수 용도 속성 집합에는 브라우저에서 사용할 사전이 포함될 수 있습니다.
- 사전의 속성 이름은 속성 ID 1로 표시된 코드 페이지에 저장됩니다. ANSI 코드 페이지의 경우 각 사전 항목은 바이트 정렬됩니다. 따라서 속성 ID가 0인 속성 이름 사이에는 간격이 없습니다. DWORD 데이터 형식의 값(속성 ID 및 속성 이름 길이 DWORD)이 32비트 경계에 맞춰지지 않아도 되는 유일한 경우입니다. 유니코드 페이지의 경우 각 사전 항목은 32비트 정렬됩니다.
- 0x001F 통해 0x0001 이진 유니코드 문자로 시작하는 속성 이름은 나중에 사용하도록 예약되어 있습니다.
- 속성 ID 0과 연결된 속성 이름은 전체 속성 집합의 이름을 나타냅니다.