メタデータ機能拡張の概要
このトピックでは、メタデータ リーダーとライターの両方を含む、Windows Imaging Component (WIC) 用のカスタム メタデータ ハンドラーを作成するための要件について説明します。 また、WIC ランタイム コンポーネント検出を拡張してカスタム メタデータ ハンドラーを含める要件についても説明します。
このトピックは、次のセクションで構成されています。
前提条件
このトピックを理解するには、WIC、そのコンポーネント、画像のメタデータについて詳しく理解しておく必要があります。 WIC メタデータの詳細については、「 WIC メタデータの概要」を参照してください。 WIC コンポーネントの詳細については、「 Windows イメージング コンポーネントの概要」を参照してください。
はじめに
WIC メタデータの概要で説明したように、多くの場合、画像内には複数のメタデータ ブロックがあり、それぞれ異なる種類の情報が異なるメタデータ形式で公開されます。 イメージ内に埋め込まれたメタデータ形式を操作するには、アプリケーションで適切なメタデータ ハンドラーを使用する必要があります。 WIC には、Exif や XMP などの特定の種類のメタデータを読み書きできる複数のメタデータ ハンドラー (メタデータ リーダーとライターの両方) が用意されています。
WIC には、提供されるネイティブ ハンドラーに加えて、WIC のランタイム コンポーネント検出に参加する新しいメタデータ ハンドラーを作成できる API が用意されています。 これにより、WIC を使用するアプリケーションは、カスタム メタデータ形式の読み取りと書き込みを行うことができます。
次の手順では、メタデータ ハンドラーが WIC の実行時メタデータ検出に参加できるようにします。
- カスタム メタデータ形式を読み取るための必要な WIC インターフェイスを公開するメタデータ リーダー ハンドラー クラス (IWICMetadataReader) を実装します。 これにより、WIC ベースのアプリケーションは、ネイティブ メタデータ形式を読み取るのと同じ方法でメタデータ形式を読み取ることができます。
- カスタム メタデータ形式をエンコードするために必要な WIC インターフェイスを公開するメタデータ ライター ハンドラー クラス (IWICMetadataWriter) を実装します。 これにより、WIC ベースのアプリケーションでメタデータ形式をサポートされているイメージ形式にシリアル化できます。
- メタデータ ハンドラーにデジタル署名して登録します。 これにより、レジストリ内の識別パターンとイメージ ファイルに埋め込まれたパターンを照合することで、実行時にメタデータ ハンドラーを検出できます。
メタデータ リーダーの作成
コーデック内のメタデータ ブロックへのメインアクセスは、各 WIC コーデックが実装する IWICMetadataBlockReader インターフェイスを介して行われます。 このインターフェイスは、イメージ形式で埋め込まれた各メタデータ ブロックを列挙して、各ブロックに対して適切なメタデータ ハンドラーを検出してインスタンス化できるようにします。 WIC によって認識されないメタデータ ブロックは不明と見なされ、GUID CLSID_WICUnknownMetadataReaderとして定義されます。 メタデータ形式を WIC で認識するには、IWICMetadataReader、IWICPersistStream、IWICStreamProvider の 3 つのインターフェイスを実装するクラスを作成する必要があります。
注意
メタデータ形式に、必要なインターフェイスの一部のメソッドを不適切にレンダリングする制限がある場合、そのようなメソッドは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 メソッドは、スキーマまたは ID によって特定のメタデータ項目を取得します。 このメソッドは、特定のスキーマまたは ID を持つメタデータ項目を取得する点を除き、 GetValueByIndex メソッドに似ています。
GetEnumerator メソッドは、メタデータ ブロック内の各メタデータ 項目の列挙子を返します。 これにより、アプリケーションは列挙子を使用してメタデータ形式を移動できます。
メタデータ形式にメタデータ項目のスキーマの概念がない場合は、GetValue...メソッドはこのプロパティを無視する必要があります。 ただし、形式でスキーマの名前付けをサポートしている場合は、 NULL 値を予測する必要があります。
メタデータ項目が埋め込みメタデータ ブロックの場合は、埋め込みコンテンツのサブストリームからメタデータ ハンドラーを作成し、新しいメタデータ ハンドラーを返します。 入れ子になったブロックに使用できるメタデータ リーダーがない場合は、不明なメタデータ リーダーをインスタンス化して返します。 埋め込みブロックの新しいメタデータ リーダーを作成するには、コンポーネント ファクトリの CreateMetadataReaderFromContainer メソッドまたは CreateMetadataReader メソッドを 呼び出すか、 WICMatchMetadataContent 関数を呼び出します。
メタデータ ストリームにビッグ エンディアン コンテンツが含まれている場合、メタデータ リーダーは、処理するデータ値をスワップする役割を担います。 また、入れ子になったメタデータ リーダーに、ビッグ エンディアン データ ストリームを操作していることを通知する責任もあります。 ただし、すべての値はリトル エンディアン形式で返す必要があります。
メタデータ項目 ID がメタデータ形式に対応する (GUID) である VT_CLSID
クエリをサポートすることで、名前空間ナビゲーションのサポートを実装します。 その形式の入れ子になったメタデータ リーダーが解析中に識別された場合は、それを返す必要があります。 これにより、アプリケーションはメタデータ クエリ リーダーを使用してメタデータ形式を検索できます。
メタデータ項目を ID で取得する場合は、 PropVariantChangeType 関数 を使用して、ID を想定される型に強制する必要があります。 たとえば、IFD リーダーは、IFD タグ ID USHORT のデータ型と一致するように ID を強制的に入力 VT_UI2
します。 これを行うには、入力型と予期される型の両方が PROPVARIANT である必要があります。 これは必須ではありませんが、この強制を実行すると、リーダーを呼び出してメタデータ項目のクエリを実行するコードが簡略化されます。
IWICPersistStream インターフェイス
IWICPersistStream インターフェイスは IPersistStream から継承され、WICPersistOptions 列挙体を使用してオブジェクトを保存および読み込むための追加のメソッドを提供します。
次のコードは、wincodecsdk.idl ファイルで定義されている IWICPersistStream インターフェイスの定義を示しています。
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 インターフェイスを使用すると、メタデータ リーダーは、そのコンテンツ ストリームへの参照を提供し、ストリームに関する情報を提供し、キャッシュされたバージョンのストリームを更新できます。
次のコードは、wincodecsdk.idl ファイルで定義されている IWICStreamProvider インターフェイスの定義を示しています。
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 メソッドは、メタデータ ストリームを更新します。 このメソッドは、入れ子になったメタデータ ブロックに対して NULL ストリームを使用して LoadEx を呼び出す必要があります。 これは、インプレース編集により、入れ子になったメタデータ ブロックとその項目が存在しなくなる可能性があるために必要です。
メタデータ ライターの作成
メタデータ ライターは、メタデータ ブロックをイメージ フレームにシリアル化する方法、またはイメージ形式でサポートされている場合は個々のフレームの外部にシリアル化する方法を提供するメタデータ ハンドラーの一種です。 コーデック内のメタデータ ライターへのメインアクセスは、各 WIC エンコーダーが実装する IWICMetadataBlockWriter インターフェイスを介して行われます。 このインターフェイスを使用すると、アプリケーションはイメージに埋め込まれている各メタデータ ブロックを列挙して、メタデータ ブロックごとに適切なメタデータ ライターを検出してインスタンス化できるようにします。 対応するメタデータ ライターがないメタデータ ブロックは不明と見なされ、GUID CLSID_WICUnknownMetadataReaderとして定義されます。 WIC 対応アプリケーションがメタデータ形式をシリアル化および書き込みできるようにするには、IWICMetadataWriter、IWICMetadataReader、IWICPersistStream、IWICStreamProvider の各インターフェイスを実装するクラスを作成する必要があります。
注意
メタデータ形式に、必要なインターフェイスの一部のメソッドを不適切にレンダリングする制限がある場合、そのようなメソッドはWINCODEC_ERR_UNSUPPORTEDOPERATIONを返す必要があります。
IWICMetadataWriter インターフェイス
IWICMetadataWriter インターフェイスは、メタデータ ライターによって実装される必要があります。 さらに、 IWICMetadataWriter はIWICMetadataReader から継承されるため、 IWICMetadataReader のすべてのメソッドも実装する必要があります。 どちらのハンドラー型も同じインターフェイス継承を必要とするため、読み取りと書き込みの両方の機能を提供する 1 つのクラスを作成できます。
次のコードは、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 メソッドは、指定したメタデータ 項目をメタデータ ストリーム内の指定したインデックスに書き込みます。 インデックスは ID ではなく、メタデータ ブロック内の項目の位置を参照します。
RemoveValue メソッドは、指定したメタデータ 項目をメタデータ ストリームから削除します。
RemoveValueByIndex メソッドは、指定したインデックスにあるメタデータ項目をメタデータ ストリームから削除します。 アイテムを削除した後、インデックスが最後のインデックスでない場合は、残りのメタデータ項目が空のインデックスを占有することが予想されます。 また、アイテムが削除された後にカウントが変更されることが予想されます。
PROPVARIANT 項目を、形式に必要な基になる構造に変換するのは、メタデータ ライターの責任です。 ただし、メタデータ リーダーとは異なり、呼び出し元が使用するデータ型を具体的に示すので、VARIANT 型を通常は異なる型に強制することはできません。
メタデータ ライターは、非表示または認識されない値を含め、すべてのメタデータ項目をイメージ ストリームにコミットする必要があります。 これには、不明な入れ子になったメタデータ ブロックが含まれます。 ただし、保存操作を開始する前に重要なメタデータ項目を設定するのはエンコーダーの責任です。
メタデータ ストリームにビッグ エンディアン コンテンツが含まれている場合、メタデータ ライターは、処理するデータ値をスワップする役割を担います。 また、入れ子になったメタデータ ライターに、保存時にビッグ エンディアン データ ストリームを操作していることを通知する責任もあります。
メタデータ形式に対応する 型 (GUID) のメタデータ項目に対する設定および削除操作をサポートすることで、名前空間の VT_CLSID
作成と削除のサポートを実装します。 メタデータ ライターは WICSerializeMetadataContent 関数を呼び出して、入れ子になったメタデータ ライターコンテンツを親メタデータ ライターに適切に埋め込みます。
メタデータ形式でインプレース エンコードがサポートされている場合は、必要なパディングを管理する必要があります。 インプレース エンコードの詳細については、「 WIC メタデータの概要 」および「 イメージ メタデータの読み取りと書き込みの概要」を参照してください。
IWICPersistStream インターフェイス
IWICPersistStream インターフェイスは IPersistStream から継承され、WICPersistOptions 列挙体を使用してオブジェクトを保存および読み込むための追加のメソッドを提供します。
次のコードは、wincodecsdk.idl ファイルで定義されている IWICPersistStream インターフェイスの定義を示しています。
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 インターフェイスの実装は、メタデータ リーダーの実装と同じです。 詳細については、このドキュメントの「メタデータ リーダーの作成」セクションを参照してください。
メタデータ ハンドラーのインストールと登録
メタデータ ハンドラーをインストールするには、ハンドラー アセンブリを指定し、システム レジストリに登録する必要があります。 レジストリ キーを設定する方法とタイミングを決定できます。
注意
読みやすくするために、実際の 16 進 GUID は、このドキュメントの次のセクションに示すレジストリ キーには表示されません。 指定したフレンドリ名の 16 進数の値を見つけるには、wincodec.idl ファイルと wincodecsdk.idl ファイルを参照してください。
メタデータ ハンドラー レジストリ キー
各メタデータ ハンドラーは一意の CLSID によって識別され、各ハンドラーはメタデータ ハンドラーのカテゴリ ID GUID に CLSID を登録する必要があります。 各ハンドラー型のカテゴリ ID は wincodec.idl で定義されます。リーダーのカテゴリ ID 名がCATID_WICMetadataReaderされ、ライターのカテゴリ ID 名がCATID_WICMetadataWriter。
各メタデータ ハンドラーは一意の CLSID によって識別され、各ハンドラーはメタデータ ハンドラーのカテゴリ ID GUID に CLSID を登録する必要があります。 各ハンドラー型のカテゴリ ID は wincodec.idl で定義されます。リーダーのカテゴリ ID 名がCATID_WICMetadataReaderされ、ライターのカテゴリ ID 名がCATID_WICMetadataWriter。
注意
次のレジストリ キーの一覧では、{Reader CLSID} は、メタデータ リーダーに提供する一意の CLSID を参照します。 {Writer CLSID} は、メタデータ ライターに提供する一意の CLSID を参照します。 {Handler CLSID} は、指定するハンドラーに応じて、リーダーの CLSID、ライターの CLSID、またはその両方を参照します。 {Container 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_ContainerFormatで始まる名前を持つ GUID として定義されます。 ネイティブでサポートされているメタデータ コンテナー形式は wincodecsdk.idl に記載されています。各メタデータ コンテナー形式は、GUID_MetadataFormatで始まる名前を持つ GUID として定義されます。
次のキーは、メタデータ リーダーがサポートするコンテナーと、そのコンテナーから読み取るために必要なデータを登録します。 リーダーでサポートされている各コンテナーは、この方法で登録する必要があります。
[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
Pattern キーは、メタデータ ブロックをリーダーと照合するために使用されるバイナリ パターンを表します。 メタデータ リーダーのパターンを定義する場合、正の一致は、メタデータ リーダーが処理されるメタデータ ブロック内のメタデータを理解できることを意味する十分な信頼性が必要です。
DataOffset キーは、ブロック ヘッダーからのメタデータの固定オフセットを表します。 このキーは省略可能であり、指定しない場合は、ブロック ヘッダーからの固定オフセットを使用して実際のメタデータを配置できないことを意味します。
メタデータ ライター
メタデータ ライターの登録には、コンテナー形式で埋め込まれたメタデータ コンテンツの前にヘッダーを書き込む方法を記述するキーも含まれています。 リーダーと同様に、コンテナー形式にはイメージ形式または別のメタデータ ブロックを指定できます。
次のキーは、メタデータ ライターがサポートするコンテナーと、ヘッダーとメタデータの書き込みに必要なデータを登録します。 ライターでサポートされている各コンテナーは、この方法で登録する必要があります。
[HKEY_CLASSES_ROOT\CLSID\{Writer CLSID}\Containers\{Container GUID}]
"WritePosition"=dword:00000000
"WriteHeader"=hex:ff,ff,ff,...
"WriteOffset"=dword:00000000
WriteHeader キーは、書き込まれるメタデータ ブロック ヘッダーのバイナリ パターンを表します。 このバイナリ パターンは、メタデータ形式のリーダー Pattern キーと一致します。
WriteOffset キーは、メタデータを書き込むブロック ヘッダーからの固定オフセットを表します。 このキーは省略可能であり、指定しない場合は、実際のメタデータを ヘッダーと共に書き出すべきではありません。
メタデータ ハンドラーの署名
WIC 検出プロセスに参加するには、すべてのメタデータ ハンドラーにデジタル署名する必要があります。 WIC では、信頼された証明機関によって署名されていないハンドラーは読み込まれません。 デジタル署名の詳細については、「コード署名 の概要」を参照してください。
特別な考慮事項
次のセクションには、独自のメタデータ ハンドラーを作成するときに考慮する必要がある追加情報が含まれています。
PROPVARIANTS
WIC は PROPVARIANT を使用して、読み取りと書き込みの両方のメタデータ項目を表します。 PROPVARIANT は、メタデータ形式で使用されるメタデータ 項目のデータ型とデータ値を提供します。 メタデータ ハンドラーのライターとして、データをメタデータ形式で格納する方法と、メタデータ ブロック内でのデータの表現方法に関する柔軟性が高まります。 次の表は、さまざまな状況で使用する適切な PROPVARIANT 型を決定するのに役立つガイドラインを示しています。
メタデータ型は... | PROPVARIANT 型を使用する | PROPVARIANT プロパティ |
---|---|---|
空または存在しない。 | VT_EMPTY | 適用不可。 |
未定義です。 | VT_BLOB | Blob プロパティを使用して、CoTaskMemAlloc を使用して割り当てられた BLOB オブジェクトのサイズとポインターを設定します。 |
メタデータ ブロック。 | 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 署名と ID の両方をカプセル化する署名を使用する必要があります。 たとえば、ネイティブの 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の登録済みパターンがあります。 最初の 4 バイト (0x38、0x42、0x49、0x4D) は 8BIM 署名であり、最後の 2 バイト (0x04、0x04) は IPTC レコードの ID です。
そのため、解決情報用の 8BIM メタデータ リーダーを作成するには、0x38、0x42、0x49、0x4D、0x03、0xEDの登録済みパターンが必要です。 ここでも、最初の 4 バイト (0x38、0x42、0x49、0x4D) は 8BIM シグネチャです。 ただし、最後の 2 バイト (0x03、0xED) は、PSD 形式で定義されている解像度情報 ID です。
関連トピック
-
概念
-
その他のリソース