Namen in IStorage
Een eigenschappenset wordt geïdentificeerd met een indelings-id (FMTID) in de interface IPropertySetStorage. In de interface IStorage wordt een eigenschappenset benoemd met een unicode-tekenreeks met een maximumlengte van 32 tekens. Om interoperabiliteit mogelijk te maken, moet er een toewijzing tussen een FMTID en een bijbehorende unicode-tekenreeks met null-beëindiging tot stand worden gebracht.
Een eigenschapsset van een FMTID converteren naar een tekenreeksnaam
Wanneer u converteert van een FMTID naar een bijbehorende Unicode-tekenreeksnaam, controleert u eerst of de FMTID een bekende waarde is, die wordt vermeld in de volgende tabel. Zo ja, gebruik dan de bijbehorende bekende tekenreeksnaam.
FMTID | Tekenreeksnaam | Semantisch |
---|---|---|
F29F85E0-4FF9-1068-AB91-08002B27B3D9 | "\005SummaryInformation" | COM2-samenvattingsinformatie |
D5CDD502-2E9C-101B-9397-08002B2CF9AE D5CDD505-2E9C-101B-9397-08002B2CF9AE |
"\005DocumentSummaryInformation" | Overzichtsgegevens van Office-documenten en door de gebruiker gedefinieerde eigenschappen. |
Notitie
De eigenschappenset DocumentSummaryInformation en UserDefined is uniek omdat deze twee secties bevat. Meerdere secties zijn niet toegestaan in een andere set eigenschappen. Zie Geserialiseerde eigenschappensetindeling voor gestructureerde opslagen De eigenschappensets DocumentSummaryInformation en UserDefinedvoor meer informatie. De eerste sectie is gedefinieerd als onderdeel van COM; de tweede is gedefinieerd door Microsoft Office.
Als de FMTID geen bekende waarde is, gebruikt u de volgende procedure om algoritme een tekenreeksnaam te vormen.
Een tekenreeksnaam opgeven
- Converteer de FMTID naar de bytevolgorde little-endian, indien nodig.
- Neem de 128 bits van de FMTID en beschouw ze als één lange bittekenreeks door elk van de bytes samen te voegen. De eerste bit van de 128-bits waarde is de minst significante bit van de eerste byte in het geheugen van de FMTID; de laatste bit van de 128-bits waarde is de belangrijkste bit van de laatste byte in het geheugen van de FMTID. Breid deze 128 bits uit naar 130 bits door twee nul-bits toe te voegen aan het einde.
- Deel de 130 bits in groepen van vijf bits; er zullen 26 dergelijke groepen zijn. Beschouw elke groep als een geheel getal met omgekeerde bitprioriteit. De eerste van de 128 bits is bijvoorbeeld de minst significante bit van de eerste groep van vijf bits; de vijfde van de 128 bits is de belangrijkste bit van de eerste groep.
- Wijs elk van deze gehele getallen toe als een index in de matrix van dertig tekens: ABCDEFGHIJKLMNOPQRSTUVWXYZ012345. Dit resulteert in een reeks van 26 Unicode-tekens die alleen hoofdletters en cijfers gebruiken. Hoofdlettergevoelige en hoofdlettergevoelige overwegingen zijn niet van toepassing, waardoor elk teken uniek is in elke landinstelling.
- Maak de uiteindelijke tekenreeks door de tekenreeks "\005" aan de voorzijde van deze 26 tekens samen te voegen voor een totale lengte van 27 tekens.
In de volgende voorbeeldcode ziet u hoe u een FMTID kunt toewijzen aan een eigenschapstekenreeks.
#define CBIT_BYTE 8
#define CBIT_CHARMASK 5
#define CCH_MAP (1 << CBIT_CHARMASK) // 32
#define CHARMASK (CCH_MAP - 1) // 0x1f
CHAR awcMap[CCH_MAP + 1] = "abcdefghijklmnopqrstuvwxyz012345";
WCHAR MapChar(ULONG I) {
return((WCHAR) awcMap[i & CHARMASK]);
}
VOID GuidToPropertyStringName(GUID *pguid, WCHAR awcname[]) {
BYTE *pb = (BYTE *) pguid;
BYTE *pbEnd = pb + sizeof(*pguid);
ULONG cbitRemain = CBIT_BYTE;
WCHAR *pwc = awcname;
*pwc++ = ((WCHAR) 0x0005);
while (pb < pbEnd) {
ULONG i = *pb >> (CBIT_BYTE - cbitRemain);
if (cbitRemain >= CBIT_CHARMASK) {
*pwc = MapChar(i);
if (cbitRemain == CBIT_BYTE &&
*pwc >= L'a' && *pwc <= L'z')
{
*pwc += (WCHAR) (L'A' - L'a');
}
pwc++;
cbitRemain -= CBIT_CHARMASK;
if (cbitRemain == 0) {
pb++;
cbitRemain = CBIT_BYTE;
}
}
else {
if (++pb < pbEnd) {
i |= *pb << cbitRemain;
}
*pwc++ = MapChar(i);
cbitRemain += CBIT_BYTE - CBIT_CHARMASK;
}
}
*pwc = L'\0';
}
Een eigenschapsset converteren van een tekenreeksnaam naar een FMTID
Conversieprogramma's van eigenschapstekenreeksnamen naar GUID's moeten kleine letters accepteren als synoniem voor hun hoofdletters.
In de volgende voorbeeldcode ziet u hoe u vanuit een eigenschapsreeks kunt toewijzen aan een FMTID.
#include "stdafx.h"
#define _INC_OLE
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define CBIT_CHARMASK 5
#define CBIT_BYTE 8
#define CBIT_GUID (CBIT_BYTE * sizeof(GUID))
#define CWC_PROPSET (1 + (CBIT_GUID + CBIT_CHARMASK-1)/CBIT_CHARMASK)
#define WC_PROPSET0 ((WCHAR) 0x0005)
#define CCH_MAP (1 << CBIT_CHARMASK) // 32
#define CHARMASK (CCH_MAP - 1) // 0x1f
CHAR awcMap[CCH_MAP + 1] = "abcdefghijklmnopqrstuvwxyz012345";
#define CALPHACHARS ('z' - 'a' + 1)
GUID guidSummary =
{ 0xf29f85e0,0x4ff9, 0x1068,
{ 0xab, 0x91, 0x08, 0x00, 0x2b, 0x27, 0xb3, 0xd9 } };
WCHAR wszSummary[] = L"SummaryInformation";
GUID guidDocumentSummary =
{ 0xd5cdd502,
0x2e9c, 0x101b,
{ 0x93, 0x97, 0x08, 0x00, 0x2b, 0x2c, 0xf9, 0xae } };
WCHAR wszDocumentSummary[] = L"DocumentSummaryInformation";
__inline WCHAR
MapChar(IN ULONG i)
{
return((WCHAR) awcMap[i & CHARMASK]);
}
ULONG PropertySetNameToGuid(
IN ULONG cwcname,
IN WCHAR const awcname[],
OUT GUID *pguid)
{
ULONG Status = ERROR_INVALID_PARAMETER;
WCHAR const *pwc = awcname;
if (pwc[0] == WC_PROPSET0)
{
//Note: cwcname includes the WC_PROPSET0, and
//sizeof(wsz...) includes the trailing L'\0', but
//the comparison excludes both the leading
//WC_PROPSET0 and the trailing L'\0'.
if (cwcname == sizeof(wszSummary)/sizeof(WCHAR) &&
wcsnicmp(&pwc[1], wszSummary, cwcname - 1) == 0)
{
*pguid = guidSummary;
return(NO_ERROR);
}
if (cwcname == CWC_PROPSET)
{
ULONG cbit;
BYTE *pb = (BYTE *) pguid - 1;
ZeroMemory(pguid, sizeof(*pguid));
for (cbit = 0; cbit < CBIT_GUID; cbit +=
CBIT_CHARMASK)
{
ULONG cbitUsed = cbit % CBIT_BYTE;
ULONG cbitStored;
WCHAR wc;
if (cbitUsed == 0)
{
pb++;
}
wc = *++pwc - L'A'; //assume uppercase
if (wc > CALPHACHARS)
{
wc += (WCHAR) (L'A' - L'a'); //try lowercase
if (wc > CALPHACHARS)
{
wc += L'a' - L'0' + CALPHACHARS;
if (wc > CHARMASK)
{
goto fail; //invalid character
}
}
}
*pb |= (BYTE) (wc << cbitUsed);
cbitStored = min(CBIT_BYTE - cbitUsed,
CBIT_CHARMASK);
//If the translated bits will not fit in the
//current byte
if (cbitStored < CBIT_CHARMASK)
{
wc >>= CBIT_BYTE - cbitUsed;
if (cbit + cbitStored == CBIT_GUID)
{
if (wc != 0)
{
goto fail; //extra bits
}
break;
}
pb++;
*pb |= (BYTE) wc;
}
}
Status = NO_ERROR;
}
}
fail:
return(Status);
}
Wanneer u een bestaande eigenschappenset probeert te openen, wordt in IPropertySetStorage::Open, de (root) FMTID geconverteerd naar een tekenreeks zoals hierboven beschreven. Als er een element van de IStorage- van die naam bestaat, wordt dit gebruikt. Anders mislukt het openen.
Bij het maken van een nieuwe eigenschappenset bepaalt de bovenstaande toewijzing de naam van de tekenreeks die wordt gebruikt.