Delen via


Overzicht van uitbreidbaarheid van metagegevens

In dit onderwerp worden de vereisten geïntroduceerd voor het maken van aangepaste metagegevenshandlers voor het WIC (Windows Imaging Component), inclusief zowel metagegevenslezers als schrijvers. Ook worden de vereisten besproken voor het uitbreiden van de WIC-runtimecomponentdetectie, inclusief uw aangepaste metagegevenshandlers.

Dit onderwerp bevat de volgende secties.

Voorwaarden

Als u dit onderwerp wilt begrijpen, moet u een uitgebreid begrip hebben van WIC, de bijbehorende onderdelen en metagegevens voor afbeeldingen. Zie de WIC Metadata Overviewvoor meer informatie over WIC-metagegevens. Zie het Overzicht van Windows Imaging-onderdelen voor meer informatie over WIC-onderdelen.

Introductie

Zoals besproken in de WIC Metadata Overview, zijn er vaak meerdere blokken metagegevens binnen een afbeelding, die elk verschillende soorten informatie in verschillende metagegevensindelingen weergeven. Als u wilt communiceren met een indeling voor metagegevens die is ingesloten in een afbeelding, moet een toepassing een geschikte metagegevenshandler gebruiken. WIC biedt verschillende metagegevenshandlers (zowel metagegevenslezers als schrijvers) waarmee u specifieke typen metagegevens, zoals Exif of XMP, kunt lezen en schrijven.

Naast de systeemeigen handlers biedt WIC API's waarmee u nieuwe metagegevenshandlers kunt maken die deelnemen aan de detectie van runtimeonderdelen van WIC. Hierdoor kunnen toepassingen die GEBRUIKMAKEN van WIC uw aangepaste metagegevensindelingen lezen en schrijven.

Met de volgende stappen kunnen uw metagegevenshandlers deelnemen aan de detectie van runtimemetagegevens van WIC.

  • Implementeer een handlerklasse voor metagegevenslezers (IWICMetadataReader) waarmee de vereiste WIC-interfaces worden weergegeven voor het lezen van uw aangepaste metagegevensindeling. Hierdoor kunnen OP WIC gebaseerde toepassingen uw metagegevensindeling lezen op dezelfde manier als ze systeemeigen indelingen voor metagegevens lezen.
  • Implementeer een handlerklasse voor metagegevensschrijver (IWICMetadataWriter) die de vereiste WIC-interfaces beschikbaar maakt voor het coderen van uw aangepaste metagegevensindeling. Hierdoor kunnen WIC-gebaseerde toepassingen uw metagegevensindeling serieel maken in ondersteunde afbeeldingsindelingen.
  • Onderteken en registreer uw metadata-verwerkers digitaal. Hierdoor kunnen uw metagegevenshandlers tijdens runtime worden gedetecteerd door het identificatiepatroon in het register te koppelen aan het patroon dat is ingesloten in het afbeeldingsbestand.

Een metagegevenslezer maken

De belangrijkste toegang tot metagegevensblokken binnen een codec is via de IWICMetadataBlockReader interface die elke WIC-codec implementeert. Deze interface inventariseert elk van de metagegevensblokken die zijn ingesloten in een afbeeldingsindeling, zodat de juiste metagegevenshandler kan worden gedetecteerd en geïnstantieerd voor elk blok. De metagegevensblokken die niet door WIC worden herkend, worden als onbekend beschouwd en worden gedefinieerd als de GUID-CLSID_WICUnknownMetadataReader. Als u de indeling voor metagegevens wilt laten herkennen door WIC, moet u een klasse maken waarmee drie interfaces worden geïmplementeerd: IWICMetadataReader, IWICPersistStreamen IWICStreamProvider.

Notitie

Als uw indeling voor metagegevens beperkingen heeft die sommige methoden van de vereiste interfaces ongepast weergeven, moeten dergelijke methoden WINCODEC_ERR_UNSUPPORTEDOPERATION retourneren.

 

IWICMetadataReader Interface

De IWICMetadataReader interface moet worden geïmplementeerd bij het maken van een metagegevenslezer. Deze interface biedt toegang tot de onderliggende metagegevensitems binnen de gegevensstroom van een metadataformaat.

De volgende code toont de definitie van de interface voor metagegevenslezers, zoals gedefinieerd in het bestand wincodecsdk.idl.

interface IWICMetadataReader : IUnknown
{
    HRESULT GetMetadataFormat(
        [out] GUID *pguidMetadataFormat
        );

    HRESULT GetMetadataHandlerInfo(
        [out] IWICMetadataHandlerInfo **ppIHandler
        );

    HRESULT GetCount(
        [out] UINT *pcCount
        );

    HRESULT GetValueByIndex(
        [in] UINT nIndex,
        [in, out, unique] PROPVARIANT *pvarSchema,
        [in, out, unique] PROPVARIANT *pvarId,
        [in, out, unique] PROPVARIANT *pvarValue
        );

    HRESULT GetValue(
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId,
        [in, out, unique] PROPVARIANT *pvarValue
        );

    HRESULT GetEnumerator(
        [out] IWICEnumMetadataItem **ppIEnumMetadata
        );
};

De methode GetMetadataFormat retourneert de GUID van uw metagegevensindeling.

De methode GetMetadataHandlerInfo retourneert een IWICMetadataHandlerInfo interface die informatie biedt over uw metagegevenshandler. Dit omvat informatie zoals welke afbeeldingsindelingen de metagegevensindeling ondersteunen en of uw metagegevenslezer toegang nodig heeft tot de volledige metagegevensstroom.

De methode GetCount retourneert het aantal afzonderlijke metagegevensitems (inclusief ingesloten metagegevensblokken) dat in de metagegevensstroom is gevonden.

De methode GetValueByIndex retourneert een metagegevensitem op basis van een indexwaarde. Met deze methode kunnen toepassingen elk metagegevensitem in een metagegevensblok doorlopen. De volgende code laat zien hoe een toepassing deze methode kan gebruiken om elk metagegevensitem in een metagegevensblok op te halen.

PROPVARIANT readerValue;
IWICMetadataBlockReader *blockReader = NULL;
IWICMetadataReader *reader = NULL;

PropVariantInit(&readerValue);

hr = pFrameDecode->QueryInterface(IID_IWICMetadataBlockReader, (void**)&blockReader);

if (SUCCEEDED(hr))
{
    // Retrieve the third block in the image. This is image specific and
    // ideally you should call this by retrieving the reader count
    // first.
    hr = blockReader->GetReaderByIndex(2, &reader);
}

if (SUCCEEDED(hr))
{
    UINT numValues = 0;

    hr = reader->GetCount(&numValues);

    // Loop through each item and retrieve by index
    for (UINT i = 0; SUCCEEDED(hr) && i < numValues; i++)
    {
        PROPVARIANT id, value;

        PropVariantInit(&id);
        PropVariantInit(&value);

        hr = reader->GetValueByIndex(i, NULL, &id, &value);

        if (SUCCEEDED(hr))
        {
            // Do something with the metadata item.
            //...
        }
        PropVariantClear(&id);
        PropVariantClear(&value);
    }               
}

De methode GetValue haalt een specifiek metagegevensitem op volgens schema en/of id. Deze methode is vergelijkbaar met de methode GetValueByIndex, behalve dat er een metagegevensitem met een specifiek schema of een specifieke id wordt opgehaald.

De methode GetEnumerator retourneert een enumerator van elk metagegevensitem in het metagegevensblok. Hierdoor kunnen toepassingen een enumerator gebruiken om door de indeling van uw metagegevens te navigeren.

Als uw metagegevensindeling geen concept van schema's voor metagegevensitems heeft, moeten de GetValue... methoden deze eigenschap negeren. Als uw indeling echter ondersteuning biedt voor schemanaamgeving, moet u een NULL--waarde verwachten.

Als een metagegevensitem een ingesloten metagegevensblok is, maakt u een metagegevenshandler van de substream van de ingesloten inhoud en retourneert u de nieuwe metagegevenshandler. Als er geen metagegevenslezer beschikbaar is voor het geneste blok, instantieer en retourneer een onbekende metagegevenslezer. Als u een nieuwe metagegevenslezer voor het ingesloten blok wilt maken, roept u de CreateMetadataReaderFromContainer of CreateMetadataReader methoden aan of roept u de functie WICMatchMetadataContent aan.

Als de metagegevensstroom big-endian-inhoud bevat, is de metagegevenslezer verantwoordelijk voor het wisselen van gegevenswaarden die worden verwerkt. Het is ook verantwoordelijk voor het informeren van alle geneste metagegevenslezers dat ze werken met big-endian-gegevensstroom. Alle waarden moeten echter worden geretourneerd in little-endian-formaat.

Implementeer ondersteuning voor naamruimtenavigatie door query's uit te voeren waarbij de id van het metagegevensitem een VT_CLSID (een GUID) is die overeenkomt met een metagegevensindeling. Als tijdens het parseren een lezer van geneste metadata voor dat formaat wordt geïdentificeerd, moet deze worden geretourneerd. Hierdoor kunnen toepassingen een metagegevensquerylezer gebruiken om uw metagegevensindeling te doorzoeken.

Wanneer u een metagegevensitem op id ophaalt, moet u PropVariantChangeType-functie gebruiken om de id naar het verwachte type te dwingen. De IFD-lezer forceert bijvoorbeeld een ID om te converteren naar type VT_UI2 om overeen te komen met het gegevenstype van een IFD-tag-ID USHORT. Het invoertype en het verwachte type moeten beide zijn PROPVARIANT om dit te doen. Dit is niet vereist, maar door deze dwang wordt code vereenvoudigd die de lezer aanroept om query's uit te voeren op metagegevensitems.

IWICPersistStream Interface

De IWICPersistStream interface neemt over van IPersistStream- en biedt aanvullende methoden voor het opslaan en laden van objecten met behulp van de WICPersistOptions opsomming.

De volgende code toont de definitie van de IWICPersistStream interface zoals gedefinieerd in het bestand wincodecsdk.idl.

interface IWICPersistStream : IPersistStream
{
    HRESULT LoadEx(
        [in, unique] IStream *pIStream,
        [in, unique] const GUID *pguidPreferredVendor,
        [in] DWORD dwPersistOptions
        );

    HRESULT SaveEx(
        [in] IStream *pIStream,
        [in] DWORD dwPersistOptions,
        [in] BOOL fClearDirty
        );
};

De methode LoadEx biedt uw metagegevenslezer een gegevensstroom met uw metagegevensblok. De lezer parseert deze stroom om toegang te krijgen tot de onderliggende metagegevensitems. Uw metagegevenslezer wordt geïnitialiseerd met een substream die aan het begin van de onbewerkte metagegevensinhoud wordt geplaatst. Als uw lezer de volledige stream niet vereist, is de substream beperkt tot alleen de inhoud van het metagegevensblok; anders wordt de volledige metagegevensstroom geleverd met de positie die is ingesteld aan het begin van het metagegevensblok.

De methode SaveEx wordt gebruikt door schrijvers van metagegevens om uw metagegevensblok te serialiseren. Wanneer SaveEx in een metagegevenslezer wordt gebruikt, zou deze WINCODEC_ERR_UNSUPPORTEDOPERATION moeten retourneren.

IWICStreamProvider Interface

De IWICStreamProvider interface stelt uw metagegevenslezer in staat verwijzingen naar de inhoudsstroom te verstrekken, informatie over de stream te verstrekken en versies van de stream in de cache te vernieuwen.

De volgende code toont de definitie van de IWICStreamProvider interface zoals gedefinieerd in het bestand wincodecsdk.idl.

interface IWICStreamProvider : IUnknown
{
    HRESULT GetStream(
        [out] IStream **ppIStream
        );

    HRESULT GetPersistOptions(
        [out] DWORD *pdwPersistOptions
        );

    HRESULT GetPreferredVendorGUID(
        [out] GUID *pguidPreferredVendor
        );

    HRESULT RefreshStream(
        );
};

De methode GetStream haalt een verwijzing naar uw metagegevensstroom op. De stream die u retourneert, moet de aanwijzer van de stream opnieuw instellen op de beginpositie. Als voor uw metagegevensindeling volledige streamtoegang is vereist, moet de beginpositie het begin van het metagegevensblok zijn.

De methode GetPersistOptions retourneert de huidige opties van de stroom uit de opsomming WICPersistOptions.

De methode GetPreferredVendorGUID retourneert de GUID van de leverancier van de metagegevenslezer.

De methode RefreshStream vernieuwt de metagegevensstroom. Deze methode moet LoadEx- aanroepen met een NULL- stream voor alle geneste metagegevensblokken. Dit is nodig omdat door bewerking ter plaatse geneste metagegevensblokken en hun items mogelijk niet meer bestaan.

Een metagegevensschrijver maken

Een metagegevensschrijver is een type metagegevenshandler dat een manier biedt om een metagegevensblok te serialiseren naar een afbeeldingsframe of buiten een afzonderlijk frame als de afbeeldingsindeling dit ondersteunt. De belangrijkste toegang tot de schrijvers van metagegevens binnen een codec is via de IWICMetadataBlockWriter interface die elke WIC-encoder implementeert. Met deze interface kunnen toepassingen elk van de metagegevensblokken opsommen die zijn ingesloten in een afbeelding, zodat de juiste schrijver van metagegevens kan worden gedetecteerd en geïnstantieerd voor elk metagegevensblok. Metagegevensblokken die geen bijbehorende schrijver voor metagegevens hebben, worden als onbekend beschouwd en worden gedefinieerd als de GUID-CLSID_WICUnknownMetadataReader. Om WIC-toepassingen in staat te stellen uw metagegevensindeling te serialiseren en te schrijven, moet u een klasse maken die de volgende interfaces implementeert: IWICMetadataWriter, IWICMetadataReader, IWICPersistStreamen IWICStreamProvider.

Notitie

Als uw indeling voor metagegevens beperkingen heeft die sommige methoden van de vereiste interfaces ongepast weergeven, moeten dergelijke methoden WINCODEC_ERR_UNSUPPORTEDOPERATION retourneren.

 

IWICMetadataWriter Interface

De IWICMetadataWriter--interface moet worden geïmplementeerd door uw metagegevensschrijver. Bovendien, omdat IWICMetadataWriter erft van IWICMetadataReader, moet u ook alle methoden van IWICMetadataReaderimplementeren. Omdat beide handlertypen dezelfde interfaceovername vereisen, kunt u één klasse maken die zowel lees- als schrijffunctionaliteit biedt.

De volgende code toont de definitie van de interface voor het schrijven van metagegevens zoals gedefinieerd in het bestand wincodecsdk.idl.

interface IWICMetadataWriter : IWICMetadataReader
{
    HRESULT SetValue(
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId,
        [in] const PROPVARIANT *pvarValue
        );

    HRESULT SetValueByIndex(
        [in] UINT nIndex,
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId,
        [in] const PROPVARIANT *pvarValue
        );

    HRESULT RemoveValue(
        [in, unique] const PROPVARIANT *pvarSchema,
        [in] const PROPVARIANT *pvarId
        );

    HRESULT RemoveValueByIndex(
        [in] UINT nIndex
        );
};

De methode SetValue schrijft het opgegeven metagegevensitem naar de metagegevensstroom.

De methode SetValueByIndex schrijft het opgegeven metagegevensitem naar de opgegeven index in de metadatastroom. De index verwijst niet naar de id, maar naar de positie van het item in het metagegevensblok.

De methode RemoveValue verwijdert het opgegeven metagegevensitem uit de metagegevensstroom.

De methode RemoveValueByIndex verwijdert het metagegevensitem op de opgegeven index uit de metagegevensstroom. Nadat u een item hebt verwijderd, wordt verwacht dat de resterende metagegevensitems de afgeschafte index in beslag nemen als de index niet de laatste index is. Er wordt ook verwacht dat het aantal wordt gewijzigd nadat het item is verwijderd.

Het is de verantwoordelijkheid van de metadata-auteur om de PROPVARIANT items te converteren naar de onderliggende structuur die vereist is voor uw formaat. In tegenstelling tot de metagegevenslezer moeten VARIANT-typen normaal gesproken niet aan verschillende typen worden gekoppeld, omdat de aanroeper specifiek aangeeft welk gegevenstype moet worden gebruikt.

Uw metagegevensschrijver moet alle metagegevensitems doorvoeren in de afbeeldingsstroom, inclusief verborgen of niet-herkende waarden. Dit omvat onbekende genestelde metagegevensblokken. Het is echter de verantwoordelijkheid van de encoder om kritieke metagegevensitems in te stellen voordat de opslagbewerking wordt gestart.

Als de metagegevensstroom big-endian-inhoud bevat, is de schrijver van metagegevens verantwoordelijk voor het wisselen van gegevenswaarden die worden verwerkt. Het is ook verantwoordelijk voor het informeren van alle geneste metagegevensschrijvers dat ze werken met een big-endian-gegevensstroom wanneer ze opslaan.

Implementeer ondersteuning voor het creëren en verwijderen van namespaces door set- en verwijderbewerkingen mogelijk te maken op metadata-items met het type VT_CLSID (een GUID) dat overeenkomt met een metadataformaat. De metagegevensschrijver roept de WICSerializeMetadataContent functie aan om de inhoud van de geneste metagegevensschrijver correct in te sluiten bij de bovenliggende metagegevensschrijver.

Als uw metagegevensindeling ondersteuning biedt voor in-place codering, bent u verantwoordelijk voor het beheren van de vereiste opvulling. Zie voor meer informatie over in-place codering WIC Metadata Overview en Overview of Reading and Writing Image Metadata.

IWICPersistStream Interface

De IWICPersistStream interface neemt over van IPersistStream- en biedt aanvullende methoden voor het opslaan en laden van objecten met behulp van de WICPersistOptions opsomming.

De volgende code toont de definitie van de IWICPersistStream interface zoals gedefinieerd in het bestand wincodecsdk.idl.

interface IWICPersistStream : IPersistStream
{
    HRESULT LoadEx(
        [in, unique] IStream *pIStream,
        [in, unique] const GUID *pguidPreferredVendor,
        [in] DWORD dwPersistOptions
        );

    HRESULT SaveEx(
        [in] IStream *pIStream,
        [in] DWORD dwPersistOptions,
        [in] BOOL fClearDirty
        );
};

De methode LoadEx biedt uw metagegevenshandler een gegevensstroom met uw metagegevensblok.

De methode SaveEx serialiseert de metagegevens in een stroom. Als de opgegeven stream hetzelfde is als de initialisatiestroom, moet u in-place codering uitvoeren. Als in-place codering wordt ondersteund, moet deze methode WINCODEC_ERR_TOOMUCHMETADATA retourneren wanneer er onvoldoende opvulling is om in-place codering uit te voeren. Als in-place codering niet wordt ondersteund, moet deze methode WINCODEC_ERR_UNSUPPORTEDOPERATION retourneren.

De methode IPersistStream::GetSizeMax moet worden geïmplementeerd en moet de exacte grootte retourneren van de metagegevensinhoud die in de daaropvolgende opslag wordt geschreven.

De methode IPersistStream::IsDirty moet worden geïmplementeerd als de schrijver van metagegevens wordt geïnitialiseerd via een stroom, zodat een afbeelding betrouwbaar kan bepalen of de inhoud ervan is gewijzigd.

Als uw metagegevensindeling geneste metagegevensblokken ondersteunt, moet uw metagegevensschrijver de serialisatie van de inhoud delegeren aan de schrijvers van de geneste metagegevens bij het opslaan in een stream.

IWICStreamProvider Interface

De implementatie van de IWICStreamProvider interface voor een metagegevensschrijver is hetzelfde als die van een metagegevenslezer. Zie de sectie Een metagegevenslezer maken in dit document voor meer informatie.

Een metagegevenshandler installeren en registreren

Als u een metagegevenshandler wilt installeren, moet u de handler-assembly opgeven en registreren in het systeemregister. U kunt bepalen hoe en wanneer de registersleutels worden ingevuld.

Notitie

Voor leesbaarheid worden de werkelijke hexadecimale GUID's niet weergegeven in de registersleutels die worden weergegeven in de volgende secties van dit document. Als u de hexadecimale waarde voor een opgegeven beschrijvende naam wilt vinden, raadpleegt u de bestanden wincodec.idl en wincodecsdk.idl.

 

Registersleutels voor metagegevenshandler

Elke metagegevenshandler wordt geïdentificeerd door een unieke CLSID en moet elke handler zijn CLSID registreren onder de categorie-id GUID van de metagegevenshandler. De categorie-id van elk handlertype wordt gedefinieerd in de wincodec.idl; de naam van de categorie-id voor lezers wordt CATID_WICMetadataReader en de naam van de categorie-id voor schrijvers wordt CATID_WICMetadataWriter.

Elke metagegevenshandler wordt geïdentificeerd door een unieke CLSID, en elke handler moet zijn CLSID registreren onder de categorie-id GUID van de metagegevenshandler. De categorie-id van elk handlertype wordt gedefinieerd in de wincodec.idl; de naam van de categorie-id voor lezers wordt CATID_WICMetadataReader en de naam van de categorie-id voor schrijvers wordt CATID_WICMetadataWriter.

Notitie

In de volgende registersleutelvermeldingen verwijst {Reader CLSID} naar de unieke CLSID die u opgeeft voor de metagegevenslezer. {Writer CLSID} verwijst naar de unieke CLSID die u opgeeft voor uw metagegevensschrijver. {Handler CLSID} verwijst naar de CLSID van de lezer, de CLSID van de schrijver of beide, afhankelijk van de handlers die u opgeeft. {Container GUID} verwijst naar het containerobject (afbeeldingsindeling of metagegevensindeling) dat het metagegevensblok kan bevatten.

 

De volgende registersleutels registreren uw metagegevenshandler met de andere beschikbare metagegevenshandlers:

[HKEY_CLASSES_ROOT\CLSID\{CATID_WICMetadataReaders}\Instance\{Reader CLSID}]
CLSID={Reader CLSID}
Friendly Name="Reader Name"

[HKEY_CLASSES_ROOT\CLSID\{CATID_ WICMetadataWriters}\Instance\{Writer CLSID}]
CLSID={Writer CLSID}
Friendly Name="Writer Name"

Naast het registreren van uw handlers in hun respectieve categorieën, moet u ook aanvullende sleutels registreren die informatie bevatten die specifiek is voor de handler. Lezers en schrijvers delen vergelijkbare vereisten voor registersleutels. De volgende syntaxis laat zien hoe u een handler registreert. Zowel de leeshandler als de schrijfhandler moeten op deze manier worden geregistreerd met hun respectieve CLSID's.

[HKEY_CLASSES_ROOT\CLSID\{CLSID}]
"Vendor"={VendorGUID}
"Date"="yyyy-mm-dd"
"Version"="Major.Minor.Build.Number"
"SpecVersion"="Major.Minor.Build.Number"
"MetadataFormat"={MetadataFormatGUID}
"RequiresFullStream"=dword:1|0
"SupportsPadding"= dword:1|0
"FixedSize"=0

[HKEY_CLASSES_ROOT\CLSID\{CLSID}\InProcServer32]
@="drive:\path\yourdll.dll"
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT\CLSID\{CLSID}\{LCID}]
Author="Author's Name"
Description = " Metadata Description"
DeviceManufacturer ="Manufacturer Name"
DeviceModels="Device,Device"
FriendlyName="Friendly Name"

Lezers van metagegevens

De registratie van de metagegevenslezer bevat ook sleutels die beschrijven hoe de lezer kan worden ingesloten in een containerindeling. Een containerindeling kan een afbeeldingsindeling zijn, zoals TIFF of JPEG; het kan ook een andere indeling voor metagegevens zijn, zoals een IFD-metagegevensblok. Systeemeigen ondersteunde containerindelingen voor installatiekopieën worden vermeld in wincodec.idl; elke containerindeling voor installatiekopieën wordt gedefinieerd als een GUID met een naam die begint met GUID_ContainerFormat. Systeemeigen ondersteunde indelingen voor metagegevenscontainers worden vermeld in wincodecsdk.idl; elke indeling van de metagegevenscontainer wordt gedefinieerd als een GUID met een naam die begint met GUID_MetadataFormat.

Met de volgende sleutels wordt een container geregistreerd die door de metagegevenslezer wordt ondersteund en de gegevens die nodig zijn om uit die container te lezen. Elke container die door de lezer wordt ondersteund, moet op deze manier worden geregistreerd.

[HKEY_CLASSES_ROOT\CLSID\{Reader CLSID}\Containers\{Container GUID}\0]
"Position"=dword:00000000
"Pattern"=hex:ff,ff,ff,...
"Mask"=hex:ff,ff,ff,...
"DataOffset"=dword:00000006

De patroonsleutel beschrijft het binaire patroon dat wordt gebruikt om het metagegevensblok aan de lezer te koppelen. Wanneer u een patroon definieert voor uw metagegevenslezer, moet het betrouwbaar genoeg zijn dat een positieve overeenkomst betekent dat de metagegevenslezer de metagegevens in het metagegevensblok kan begrijpen dat wordt verwerkt.

De DataOffset-sleutel beschrijft de vaste offset van de metagegevens van de blokheader. Deze sleutel is optioneel en, indien niet opgegeven, betekent dat de werkelijke metagegevens zich niet kunnen bevinden met behulp van een vaste offset van de blokkoptekst.

Metagegevensschrijvers

De registratie van metagegevensschrijvers bevat ook sleutels waarmee wordt beschreven hoe u de header schrijft die voorafgaat aan de metagegevensinhoud die is ingesloten in een containerindeling. Net als bij de lezer kan een containerindeling een afbeeldingsindeling of een ander metagegevensblok zijn.

Met de volgende sleutels wordt een container geregistreerd die door de metagegevensschrijver wordt ondersteund en de gegevens die nodig zijn om de header en metagegevens te schrijven. Elke container die door de schrijver wordt ondersteund, moet op deze manier worden geregistreerd.

[HKEY_CLASSES_ROOT\CLSID\{Writer CLSID}\Containers\{Container GUID}]
"WritePosition"=dword:00000000
"WriteHeader"=hex:ff,ff,ff,...
"WriteOffset"=dword:00000000

De WriteHeader-sleutel beschrijft het binaire patroon van de metagegevensblokheader die moet worden geschreven. Dit binaire patroon komt overeen met de patroonsleutel van het metadataformaat.

De WriteOffset-sleutel beschrijft de vaste offset van de blokkop waarop de metagegevens moeten worden geschreven. Deze sleutel is optioneel en, indien niet opgegeven, betekent dat de werkelijke metagegevens niet met de header moeten worden weggeschreven.

Een metagegevenshandler ondertekenen

Alle metagegevenshandlers moeten digitaal zijn ondertekend om deel te nemen aan het WIC-detectieproces. WIC laadt geen handler die niet is ondertekend door een vertrouwde certificeringsinstantie. Zie Inleiding tot ondertekening van programmacodevoor meer informatie over digitale ondertekening.

Speciale overwegingen

De volgende secties bevatten aanvullende informatie die u moet overwegen bij het maken van uw eigen metagegevenshandlers.

PROPVARIANTEN

WIC maakt gebruik van een PROPVARIANT- om een metagegevensitem weer te geven voor zowel lezen als schrijven. Een PROPVARIANT biedt een gegevenstype en gegevenswaarde voor een metagegevensitem dat wordt gebruikt in een metagegevensindeling. Als schrijver van een metagegevenshandler hebt u veel flexibiliteit over hoe gegevens worden opgeslagen in de indeling van metagegevens en hoe gegevens worden weergegeven in een metagegevensblok. De volgende tabel bevat richtlijnen ter ondersteuning bij het maken van een beslissing over het juiste PROPVARIANT-type dat in verschillende situaties moet worden gebruikt.

Het type metagegevens is... PROPVARIANT-type gebruiken EIGENSCHAP PROPVARIANT
Leeg of niet aanwezig. VT_EMPTY Niet van toepassing.
Ongedefinieerde. VT_BLOB Gebruik de blob-eigenschap om de grootte en aanwijzer in te stellen op het blOB-object dat is toegewezen met CoTaskMemAlloc.
Een metagegevensblok. VT_UNKNOWN Dit type maakt gebruik van de eigenschap punkVal.
Een matrix met typen. VT_VECTOR | VT_{type} Gebruik de ca{type} eigenschap om het aantal en de pointer in te stellen naar de array die is toegewezen met CoTaskMemAlloc.
Een matrix met metagegevensblokken. VT_VECTOR | VT_VARIANT Gebruik de eigenschap capropvar om de matrix van varianten in te stellen.
Een ondertekende rationele waarde. VT_I8 Gebruik de eigenschap hVal om de waarde in te stellen. Zet het hoge woord op de noemer en het lage woord op de teller.
Een rationele waarde. VT_UI8 Gebruik de eigenschap uhVal om de waarde in te stellen. Stel het HighPart in op de noemer en het LowPart op de teller. Houd er rekening mee dat het LowPart een niet-ondertekende int is. De teller moet worden geconverteerd van een niet-ondertekende int naar een int om ervoor te zorgen dat de tekenbit behouden blijft indien aanwezig.

 

Gebruik geen veilige matrices om redundantie te voorkomen bij het weergeven van matrixitems; alleen eenvoudige matrices gebruiken. Dit vermindert het werk dat een toepassing moet uitvoeren bij het interpreteren van PROPVARIANT- typen.

Vermijd het gebruik van VT_BYREF en sla waar mogelijk waarden inline op. VT_BYREF is inefficiënt voor kleine typen (gemeenschappelijk voor metagegevensitems) en biedt geen informatie over de grootte.

Voordat u een PROPVARIANT-gebruikt, roept u altijd PropVariantInit- aan om de waarde te initialiseren. Wanneer u klaar bent met de PROPVARIANT, roept u altijd PropVariantClear aan om het geheugen dat voor de variabele is toegewezen vrij te geven.

8BIM-handlers

Wanneer u een metagegevenshandler schrijft voor een 8BIM-metagegevensblok, moet u een handtekening gebruiken die zowel de 8BIM-handtekening als de id inkapselt. De systeemeigen 8BIMIPTC-metagegevenslezer biedt bijvoorbeeld de volgende registerinformatie voor detectie van lezers:

[HKEY_CLASSES_ROOT\CLSID\{0010668C-0801-4DA6-A4A4-826522B6D28F}\Containers\{16100D66-8570-4BB9-B92D-FDA4B23ECE67}\0]
"Position"=dword:00000000
"Pattern"=hex:38,42,49,4d,04,04
"Mask"=hex:ff,ff,ff,ff,ff,ff
"DataOffset"=dword:00000006

De 8BIMIPTC-lezer heeft een geregistreerd patroon van 0x38, 0x42, 0x49, 0x4D, 0x04, 0x04. De eerste vier bytes (0x38, 0x42, 0x49, 0x4D) zijn de 8BIM-handtekening en de laatste twee bytes (0x04, 0x04) zijn de id voor de IPTC-record.

Als u dus een 8BIM-metagegevenslezer wilt schrijven voor oplossingsinformatie, hebt u een geregistreerd patroon nodig van 0x38, 0x42, 0x49, 0x4D, 0x03, 0xED. Nogmaals, de eerste vier bytes (0x38, 0x42, 0x49, 0x4D) zijn de 8BIM-handtekening. De laatste twee bytes (0x03, 0xED) zijn echter de resolutiegegevens-ID zoals gedefinieerd door de PSD-indeling.

Conceptuele

Overzicht van Windows Imaging-onderdelen

Overzicht van WIC-metagegevens

Overzicht van metagegevensquerytaal

Overzicht van metagegevens van lees- en schrijfafbeeldingen

Instructies: Een JPEG-afbeelding opnieuw coderen met metagegevens

andere resources

Hoe een WIC-Enabled CODEC moet worden geschreven