Поделиться через


Общие сведения о расширяемости метаданных

В этом разделе приведены требования к созданию пользовательских обработчиков метаданных для компонента образов Windows (WIC), включая средства чтения метаданных и записи. В нем также рассматриваются требования к расширению обнаружения компонентов во время выполнения WIC для включения пользовательских обработчиков метаданных.

В этом разделе содержатся следующие разделы.

Необходимые условия

Чтобы понять эту тему, необходимо подробно понять WIC, его компоненты и метаданные для изображений. Дополнительные сведения о метаданных WIC см. в обзоре метаданных WIC. Для получения дополнительных сведений о компонентах WIC см. обзор компонента Windows Imaging.

Знакомство

Как описано в обзоре метаданных WIC, часто существует несколько блоков метаданных в изображении, каждый из которых представляет различные типы информации в разных форматах метаданных. Чтобы взаимодействовать с форматом метаданных, внедренным в изображение, приложение должно использовать соответствующий обработчик метаданных. WIC предоставляет несколько обработчиков метаданных (как средства чтения метаданных, так и записи), которые позволяют читать и записывать определенные типы метаданных, например Exif или XMP.

Помимо предоставленных собственных обработчиков WIC предоставляет API-интерфейсы, позволяющие создавать новые обработчики метаданных, участвующие в обнаружении компонентов во время выполнения WIC. Это позволяет приложениям, используюющим WIC для чтения и записи пользовательских форматов метаданных.

Следующие шаги позволяют обработчикам метаданных участвовать в обнаружении метаданных во время выполнения WIC.

  • Реализуйте класс обработчика метаданных (IWICMetadataReader), предоставляющий необходимые интерфейсы WIC для чтения пользовательского формата метаданных. Это позволяет приложениям на основе WIC читать формат метаданных так же, как они считывают собственные форматы метаданных.
  • Реализуйте класс обработчика модуля записи метаданных (IWICMetadataWriter), который предоставляет необходимые интерфейсы WIC для кодирования пользовательского формата метаданных. Это позволяет приложениям на основе WIC сериализовать формат метаданных в поддерживаемые форматы изображений.
  • Цифровая подпись и регистрация обработчиков метаданных. Это позволяет вашим обработчикам метаданных обнаруживаться во время выполнения, сопоставляя шаблон идентификации, находящийся в реестре, с шаблоном, внедренным в файл образа.

Создание средства чтения метаданных

Основной доступ к блокам метаданных в кодеке заключается в интерфейсе IWICMetadataBlockReader, который реализует каждый кодек WIC. Этот интерфейс перечисляет каждый из блоков метаданных, внедренных в формат изображения, чтобы для каждого блока можно было обнаружить и создать соответствующий обработчик метаданных. Блоки метаданных, которые не распознаются WIC, считаются неизвестными и определяются как guid CLSID_WICUnknownMetadataReader. Чтобы формат метаданных распознавался WIC, необходимо создать класс, реализующий три интерфейса: IWICMetadataReader, IWICPersistStreamи IWICStreamProvider.

Заметка

Если в формате метаданных есть ограничения, которые делают некоторые методы необходимых интерфейсов неуместными, такие методы должны возвращать WINCODEC_ERR_UNSUPPORTEDOPERATION.

 

Интерфейс IWICMetadataReader

Интерфейс IWICMetadataReader необходимо реализовать при создании средства чтения метаданных. Этот интерфейс предоставляет доступ к вложенным элементам метаданных в потоке данных формата метаданных.

В следующем коде показано определение интерфейса чтения метаданных, как определено в файле 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
        );
};

Метод GetMetadataFormat возвращает GUID формата метаданных.

Метод GetMetadataHandlerInfo возвращает интерфейс IWICMetadataHandlerInfo, предоставляющий сведения о обработчике метаданных. К ним относятся такие сведения, как форматы изображений, которые поддерживают формат метаданных, и требуется ли вашему средству чтения метаданных доступ к полному потоку метаданных.

Метод GetCount возвращает количество отдельных элементов метаданных (включая внедренные блоки метаданных), найденных в потоке метаданных.

Метод GetValueByIndex возвращает элемент метаданных по значению индекса. Этот метод позволяет приложениям выполнять циклы по каждому элементу метаданных в блоке метаданных. В следующем коде показано, как приложение может использовать этот метод для получения каждого элемента метаданных в блоке метаданных.

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);
    }               
}

Метод getValue извлекает определенный элемент метаданных по схеме и/или идентификатору. Этот метод аналогичен методу Метод GetValueByIndex, за исключением того, что он извлекает элемент метаданных с определенной схемой или идентификатором.

Метод GetEnumerator возвращает перечислитель каждого элемента метаданных в блоке метаданных. Это позволяет приложениям использовать перечислитель для навигации по формату метаданных.

Если формат метаданных не имеет понятия о схемах для элементов метаданных, методы GetValue... следует игнорировать это свойство. Однако если формат поддерживает именование схем, следует ожидать значение NULL.

Если элемент метаданных является внедренным блоком метаданных, создайте обработчик метаданных из подпотока внедренного содержимого и верните новый обработчик метаданных. Если для вложенного блока нет средства чтения метаданных, создайте экземпляр и верните неизвестное средство чтения метаданных. Чтобы создать средство чтения метаданных для внедренного блока, вызовите метод CreateMetadataReaderFromContainer или CreateMetadataReader в фабрике компонентов, или используйте функцию WICMatchMetadataContent.

Если поток метаданных содержит содержимое большого плана, средство чтения метаданных отвечает за переключение значений данных, которые он обрабатывает. Он также отвечает за информирование всех вложенных читателей метаданных о том, что они работают с потоком данных большого плана. Однако все значения должны быть возвращены в малоконечном формате.

Реализуйте поддержку навигации пространства имен, поддерживая запросы, в которых идентификатор элемента метаданных является VT_CLSID (GUID), соответствующий формату метаданных. Если вложенное средство чтения метаданных для этого формата определяется во время синтаксического анализа, оно должно быть возвращено. Это позволяет приложениям использовать средство чтения запросов метаданных для поиска в формате метаданных.

При получении элемента метаданных по идентификатору следует использовать функцию PropVariantChangeType, чтобы преобразовать идентификатор в ожидаемый тип. Например, средство чтения IFD принудит идентификатор к типу данных VT_UI2, чтобы совпадать с типом данных идентификатора тега IFD USHORT. Входной тип и ожидаемый тип должны быть PROPVARIANT для этого. Это не обязательно, но приведение упрощает код, который вызывает читателя запросы к элементам метаданных.

Интерфейс IWICPersistStream

Интерфейс IWICPersistStream наследует от IPersistStream и предоставляет дополнительные методы для сохранения и загрузки объектов с помощью перечисления WICPersistOptions.

В следующем коде показано определение интерфейса IWICPersistStream, как определено в файле 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
        );
};

Метод LoadEx предоставляет читателю метаданных поток данных, содержащий блок метаданных. Читатель анализирует этот поток для доступа к базовым элементам метаданных. Ваш читатель метаданных инициализируется подпотоком, расположенным в начале сырого содержимого метаданных. Если вашему читателю не требуется полный поток, подпоток ограничен диапазоном только содержимого блока метаданных; в противном случае предоставляется полный поток метаданных с установкой позиции в начале вашего блока метаданных.

Метод SaveEx используется писателями метаданных для сериализации вашего блока метаданных. Если SaveEx используется в средстве чтения метаданных, он должен возвращать WINCODEC_ERR_UNSUPPORTEDOPERATION.

Интерфейс IWICStreamProvider

Интерфейс IWICStreamProvider позволяет средству чтения метаданных предоставлять ссылки на его поток содержимого, предоставлять сведения о потоке и обновлять кэшированные версии потока.

В следующем коде показано определение интерфейса IWICStreamProvider, как определено в файле wincodecsdk.idl.

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

    HRESULT GetPersistOptions(
        [out] DWORD *pdwPersistOptions
        );

    HRESULT GetPreferredVendorGUID(
        [out] GUID *pguidPreferredVendor
        );

    HRESULT RefreshStream(
        );
};

Метод GetStream получает ссылку на поток метаданных. Возвращаемый поток должен сбросить указатель потока на начальную позицию. Если для формата метаданных требуется полный доступ к потоку, начальная позиция должна быть началом блока метаданных.

Метод GetPersistOptions возвращает текущие параметры потока из перечисленияWICPersistOptions.

Метод GetPreferredVendorGUID возвращает GUID поставщика средства чтения метаданных.

Метод RefreshStream обновляет поток метаданных. Этот метод должен вызывать LoadEx с поток ом NULL для всех вложенных блоков метаданных. Это необходимо, так как вложенные блоки метаданных и их элементы больше не существуют из-за редактирования на месте.

Создание записи метаданных

Модуль записи метаданных — это тип обработчика метаданных, который предоставляет способ сериализации блока метаданных в кадр изображения или за пределами отдельного кадра, если формат изображения поддерживает его. Основной доступ к авторам метаданных в рамках кодека осуществляется через интерфейс IWICMetadataBlockWriter, который реализует каждый кодировщик WIC. Этот интерфейс позволяет приложениям перечислять каждый из блоков метаданных, встроенных в изображение, чтобы соответствующий модуль записи метаданных мог быть обнаружен и создан для каждого блока метаданных. Блоки метаданных, не имеющие соответствующего писателя метаданных, считаются неизвестными и определяются как GUID CLSID_WICUnknownMetadataReader. Чтобы дать возможность приложениям с поддержкой WIC сериализовать и записывать ваш формат метаданных, необходимо создать класс, реализующий следующие интерфейсы: IWICMetadataWriter, IWICMetadataReader, IWICPersistStreamи IWICStreamProvider.

Заметка

Если в формате метаданных есть ограничения, которые делают некоторые методы требуемых интерфейсов неподходящими, такие методы должны возвращать WINCODEC_ERR_UNSUPPORTEDOPERATION.

 

Интерфейс IWICMetadataWriter

Интерфейс IWICMetadataWriter должен быть реализован вашими средствами записи метаданных. Кроме того, поскольку IWICMetadataWriter наследует от IWICMetadataReader, необходимо также реализовать все методы IWICMetadataReader. Так как оба типа обработчика требуют одного наследования интерфейса, может потребоваться создать один класс, предоставляющий функции чтения и записи.

В следующем коде показано определение интерфейса записи метаданных, как определено в файле 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
        );
};

Метод setValue записывает указанный элемент метаданных в поток метаданных.

Метод SetValueByIndex записывает указанный элемент метаданных в указанный индекс в потоке метаданных. Индекс не ссылается на идентификатор, а на позицию элемента в блоке метаданных.

Метод RemoveValue удаляет указанный элемент метаданных из потока метаданных.

Метод RemoveValueByIndex удаляет элемент метаданных по указанному индексу из потока метаданных. После удаления элемента ожидается, что оставшиеся элементы метаданных будут занимать освобожденный индекс, если индекс не является последним индексом. Ожидается также, что количество изменится после удаления элемента.

Ответственность автора метаданных заключается в преобразовании элементов PROPVARIANT в базовую структуру, необходимую для вашего формата. Однако, в отличие от средства чтения метаданных, типы VARIANT обычно не должны принуждаться к другим типам, так как вызывающий объект явно указывает, какой тип данных следует использовать.

Ваш модуль записи метаданных обязан записать все элементы метаданных в поток изображения, включая невидимые или нераспознанные значения. К ним относятся неизвестные вложенные блоки метаданных. Однако кодировщик несет ответственность за задание всех критически важных элементов метаданных перед началом операции сохранения.

Если поток метаданных содержит big-endian содержимое, писатель метаданных отвечает за перестановку значений данных, которые он обрабатывает. Он также отвечает за информирование всех вложенных авторов метаданных о том, что они работают с потоками данных в формате биг-эндиан при его сохранении.

Реализуйте поддержку создания и удаления пространства имен, поддерживая операции набора и удаления элементов метаданных с типом VT_CLSID (GUID), соответствующим формату метаданных. Модуль записи метаданных вызывает функцию WICSerializeMetadataContent для правильного внедрения содержимого вложенных метаданных в родительский модуль записи метаданных.

Если ваш формат метаданных поддерживает кодировку на месте, вы ответственны за правильное управление необходимыми пробелами. Дополнительные сведения о кодировке на месте см. в обзоре метаданных WIC и в обзоре метаданных изображения для чтения и записи.

Интерфейс IWICPersistStream

Интерфейс IWICPersistStream наследует от IPersistStream и предоставляет дополнительные методы для сохранения и загрузки объектов с помощью перечисления WICPersistOptions.

В следующем коде показано определение интерфейса IWICPersistStream, как определено в файле 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
        );
};

Метод LoadEx предоставляет обработчику метаданных поток данных, содержащий блок метаданных.

Метод SaveEx сериализует метаданные в поток. Если предоставленный поток совпадает с потоком инициализации, необходимо выполнить кодировку на месте. Если кодировка на месте поддерживается, этот метод должен возвращать WINCODEC_ERR_TOOMUCHMETADATA при нехватке свободного пространства для выполнения кодирования на месте. Если кодирование на месте не поддерживается, этот метод должен возвращать WINCODEC_ERR_UNSUPPORTEDOPERATION.

Метод IPersistStream::GetSizeMax должен быть реализован и должен возвращать точный размер содержимого метаданных, которое будет записано в последующем сохранении.

Метод IPersistStream::IsDirty следует реализовать, если модуль записи метаданных инициализируется через поток, чтобы изображение могло надежно определить, изменилось ли его содержимое.

Если формат метаданных поддерживает вложенные блоки метаданных, ваш автор метаданных должен делегировать вложенным авторам метаданных задачу сериализации их содержимого при сохранении в поток.

Интерфейс IWICStreamProvider

Реализация интерфейса IWICStreamProvider для модуля записи метаданных совпадает с реализацией средства чтения метаданных. Дополнительные сведения см. в разделе "Создание средства чтения метаданных" в этом документе.

Установка и регистрация обработчика метаданных

Чтобы установить обработчик метаданных, необходимо предоставить сборку обработчика и зарегистрировать ее в системном реестре. Вы можете решить, как и когда заполняются разделы реестра.

Заметка

Для удобства чтения действительные шестнадцатеричные идентификаторы GUID не показаны в ключах реестра, указанных в следующих разделах этого документа. Чтобы найти шестнадцатеричное значение для указанного понятного имени, см. файлы wincodec.idl и wincodecsdk.idl.

 

Ключи реестра обработчика метаданных

Каждый обработчик метаданных идентифицируется уникальным CLSID, и каждому обработчику необходимо зарегистрировать свой CLSID в GUID категории обработчика метаданных. Идентификатор категории каждого типа обработчика определяется в wincodec.idl; идентификатор категории для читателей называется CATID_WICMetadataReader, а идентификатор категории для записывающих устройств — CATID_WICMetadataWriter.

Каждый обработчик метаданных определяется уникальным CLSID, и для каждого обработчика требуется регистрация CLSID в рамках GUID категории идентификатора обработчика метаданных. Идентификатор категории каждого типа обработчика определяется в wincodec.idl; идентификатор категории для читателей называется CATID_WICMetadataReader, а для записывающих называется CATID_WICMetadataWriter.

Заметка

В следующих разделах реестра {Reader CLSID} ссылается на уникальный CLSID, предоставленный для вашего средства чтения метаданных. {Модуль записи CLSID} ссылается на уникальный CLSID, предоставляемый для вашего модуля записи метаданных. {Handler CLSID} ссылается на CLSID читателя, CLSID писателя или оба, в зависимости от того, какие обработчики вы предоставляете. {GUID контейнера} ссылается на объект контейнера (формат изображения или формат метаданных), который может содержать блок метаданных.

 

Следующие разделы реестра регистрируют ваш обработчик метаданных наряду с другими доступными обработчиками метаданных.

[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"

Помимо регистрации обработчиков в соответствующих категориях, необходимо также зарегистрировать дополнительные ключи, предоставляющие сведения, относящиеся к обработчику. Читатели и писатели предъявляют аналогичные требования к разделу реестра. В следующем синтаксисе показано, как зарегистрировать обработчик. Обработчик чтения и обработчик записи должны быть зарегистрированы таким образом, используя соответствующие CLSID:

[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"

Средства чтения метаданных

Регистрация читателя метаданных также включает ключи, описывающие, как читатель может быть внедрен в контейнерный формат. Формат контейнера может быть форматом изображения, например TIFF или JPEG; Он также может быть другим форматом метаданных, например блоком метаданных IFD. Форматы контейнеров изображений, изначально поддерживаемые, перечислены в файле wincodec.idl; каждый формат контейнера изображений определяется как GUID с именем, начинающимся с GUID_ContainerFormat. Форматы контейнеров метаданных изначально поддерживаются в wincodecsdk.idl; каждый формат контейнера метаданных определяется как GUID с именем, начинающимся с GUID_MetadataFormat.

Следующие ключи регистрируют контейнер, поддерживаемый средством чтения метаданных, и данные, необходимые для чтения из этого контейнера. Каждый контейнер, поддерживаемый средством чтения, должен быть зарегистрирован таким образом.

[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

Ключ шаблона описывает двоичный шаблон, используемый для сопоставления блока метаданных с читателем. При определении шаблона для средства чтения метаданных он должен быть достаточно надежным, так, чтобы положительное совпадение означало, что средство чтения метаданных может понять метаданные в обрабатываемом блоке метаданных.

Ключ DataOffset описывает фиксированное смещение метаданных по отношению к заголовку блока. Этот ключ является необязательным и, если он не указан, означает, что фактические метаданные не могут быть найдены по фиксированному смещению от заголовка блока.

Создатели метаданных

Регистрация метаданных также включает ключи, описывающие, как записывать заголовок, предшествующий содержимому метаданных, встроенных в формат контейнера. Как и в случае с читателем, формат контейнера может быть форматом изображения или другим блоком метаданных.

Следующие ключи регистрируют контейнер, поддерживаемый средством записи метаданных, и данные, необходимые для записи заголовка и метаданных. Каждый контейнер, поддерживаемый средством записи, должен быть зарегистрирован таким образом.

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

Ключ WriteHeader описывает двоичный шаблон заголовка блока метаданных для записи. Этот двоичный шаблон совпадает с ключом шаблона чтения метаданных.

Ключ WriteOffset описывает фиксированное смещение от заголовка блока, куда должны записываться метаданные. Этот ключ является необязательным и, если он не указан, означает, что фактические метаданные не должны быть записаны с заголовком.

Подписывание обработчика метаданных

Все обработчики метаданных должны быть цифрово подписаны для участия в процессе обнаружения WIC. WIC не загружает обработчик, который не подписан доверенным центром сертификации. Дополнительные сведения о цифровой подписи, см. в Введение в подписывание кода.

Особые соображения

В следующих разделах содержатся дополнительные сведения, которые необходимо учитывать при создании собственных обработчиков метаданных.

PROPVARIANTS

WIC использует PROPVARIANT для представления элемента метаданных для чтения и записи. PROPVARIANT предоставляет тип данных и значение данных для элемента метаданных, используемого в формате метаданных. Как разработчик обработчика метаданных, у вас есть много гибкости в том, как данные хранятся в формате метаданных и как данные представлены в блоке метаданных. В следующей таблице приведены рекомендации по выбору соответствующего типа PROPVARIANT для использования в разных ситуациях.

Тип метаданных... Использование типа PROPVARIANT Свойство PROPVARIANT
Пустое или несуществующее. VT_EMPTY Неприменимо.
Неопределенный. VT_BLOB Используйте свойство BLOB, чтобы установить размер и указатель на BLOB-объект, выделенный с помощью CoTaskMemAlloc.
Блок метаданных. VT_UNKNOWN Этот тип использует свойство punkVal.
Массив типов. VT_VECTOR | VT_{type} Используйте свойство ca{type} для задания количества и указателя на массив, выделенный с помощью CoTaskMemAlloc.
Массив блоков метаданных. VT_VECTOR | VT_VARIANT Используйте свойство capropvar для задания массива вариантов.
Подписанное рациональное значение. VT_I8 Используйте свойство hVal для задания значения. Присвойте высокому слову знаменатель и нижнему слову числитель.
Рациональное значение. VT_UI8 Используйте свойство uhVal для задания значения. Установите HighPart в знаменатель, и LowPart в числитель. Обратите внимание, что LowPart является беззнаковым int. Числитель должен быть преобразован из беззнакового int в int, чтобы убедиться, что бит знака сохраняется при наличии.

 

Чтобы избежать избыточности в представлении элементов массива, не используйте безопасные массивы; используйте только простые массивы. Это сокращает объем работы, которую приложению необходимо выполнить при интерпретации типов PROPVARIANT.

Избегайте использования VT_BYREF и хранения значений по возможности. VT_BYREF неэффективно для небольших типов (распространенных для элементов метаданных) и не предоставляет сведения о размере.

Перед использованием PROPVARIANTвсегда вызывайте PropVariantInit для инициализации значения. Завершив работу с PROPVARIANT, всегда вызывайте PropVariantClear, чтобы освободить любую память, выделенную для переменной.

Обработчики 8BIM

При написании обработчика метаданных для блока метаданных 8BIM необходимо использовать подпись, которая инкапсулирует как подпись 8BIM, так и идентификатор. Например, средство чтения метаданных 8BIMIPTC предоставляет следующие сведения реестра для обнаружения читателей:

[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

Модуль 8BIMIPTC имеет зарегистрированный шаблон 0x38, 0x42, 0x49, 0x4D, 0x04, 0x04. Первые четыре байта (0x38, 0x42, 0x49, 0x4D) являются подписью 8BIM, а последние два байта (0x04, 0x04) — это идентификатор записи IPTC.

Таким образом, для записи средства чтения метаданных 8BIM для сведений о разрешении потребуется зарегистрированный шаблон 0x38, 0x42, 0x49, 0x4D, 0x03, 0xED. Опять же, первые четыре байта (0x38, 0x42, 0x49, 0x4D) являются подписью 8BIM. Последние два байта (0x03, 0xED), однако, являются идентификатором сведений о разрешении в соответствии с форматом PSD.

концептуальные

обзор компонента образов Windows

Обзор метаданных WIC

Обзор языка запросов метаданных

общие сведения о чтении и записи метаданных изображений

Инструкция: Переодкодирование изображения JPEG с метаданными

другие ресурсы

Как написать WIC-Enabled кодек