IWICMetadataQueryReader
COM公式ドキュメント
メタデータクエリ式を使用して、デコーダーまたはその画像フレームからメタデータブロックおよびアイテムを取得するためのメソッドを公開します。
解説(Remarks)
メタデータクエリリーダーは、メタデータクエリ式を使用して埋め込みメタデータにアクセスします。メタデータクエリ言語の詳細については、Metadata Query Language Overview を参照してください。
クエリリーダーの利点は、メタデータアイテムに単一のステップでアクセスできる点です。
クエリリーダーは、GetEnumerator メソッドを利用して、メタデータ階層全体をたどる手段も提供します。 ただし、IWICMetadataBlockReader および IWICMetadataReader の方が、より便利かつ低コストな方法を提供するため、このメソッドの使用は推奨されません。
例
次のコードは、クエリリーダーを取得し、それを使用してメタデータアイテムを取得する方法を示します。
// Get the query reader
if (SUCCEEDED(hr))
{
hr = pFrameDecode->GetMetadataQueryReader(&pQueryReader);
}
if (SUCCEEDED(hr))
{
hr = pQueryReader->GetMetadataByName(L"/app1/ifd/{ushort=18249}", &value);
PropVariantClear(&value);
}
次のコードは、クエリリーダーを取得し、それを使用して入れ子になったメタデータブロックを取得する方法を示します。
// Get the query reader
if (SUCCEEDED(hr))
{
hr = pFrameDecode->GetMetadataQueryReader(&pQueryReader);
}
if (SUCCEEDED(hr))
{
// Get the embedded IFD reader
hr = pQueryReader->GetMetadataByName(L"/app1/ifd", &value);
if (value.vt == VT_UNKNOWN)
{
hr = value.punkVal->QueryInterface(IID_IWICMetadataQueryReader, (void **)&pEmbedReader);
}
PropVariantClear(&value); // Clear value for new query
}
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
メタデータクエリリーダーのコンテナー形式を取得します。
| pguidContainerFormat | GUID* | out | コンテナー形式の GUID を受け取るポインター。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
ルートメタデータブロックからの相対的な現在のパスを取得します。
| cchMaxLength | DWORD | in | wzNamespace バッファーの長さ。 |
| wzNamespace | LPWSTR | inout | 現在の名前空間の位置を受け取るポインター。 |
| pcchActualLength | DWORD* | out | 現在の名前空間の位置を取得するために実際に必要となったバッファーの長さ。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
wzNamespace に NULL を渡した場合、GetLocation は cchMaxLength を無視し、pcchActualLength が指す変数にパスを格納するために必要なバッファー長を返します。
クエリリーダーがメタデータ階層の最上位に対して相対的である場合は、1文字の文字列を返します。
クエリリーダーが入れ子になったメタデータブロックに対して相対的である場合、このメソッドは現在のクエリリーダーへのパスを返します。
メタデータクエリ式によって識別されるメタデータブロックまたはアイテムを取得します。
| wzName | LPWSTR | in | 要求するメタデータブロックまたはアイテムへのクエリ式。 |
| pvarValue | PROPVARIANT* | inout | このメソッドが返るときに、要求されたメタデータブロックまたはアイテムが格納されます。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
GetMetadataByName は、メタデータクエリ式を使用して埋め込みメタデータにアクセスします。メタデータクエリ言語の詳細については、Metadata Query Language Overview を参照してください。
同じクエリ式で表される複数のブロックまたはアイテムが存在する場合は、最初に見つかったメタデータブロックまたはアイテムが返されます。
メタデータ階層内の現在の相対位置にあるすべてのメタデータアイテムの列挙子を取得します。
| ppIEnumString | IEnumString** | out | 現在の IWICMetadataQueryReader で使用できるクエリ文字列を含む列挙子の IEnumString インターフェイスへのポインターを受け取る変数へのポインター。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
取得される列挙子には、階層の現在のレベルにあるメタデータブロックおよびアイテムのクエリ文字列のみが含まれます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IWICMetadataQueryReader "{30989668-E1C9-4597-B395-458EEDB808DF}" #usecom global IWICMetadataQueryReader IID_IWICMetadataQueryReader "{}" #comfunc global IWICMetadataQueryReader_GetContainerFormat 3 var #comfunc global IWICMetadataQueryReader_GetLocation 4 int,var,var #comfunc global IWICMetadataQueryReader_GetMetadataByName 5 wstr,var #comfunc global IWICMetadataQueryReader_GetEnumerator 6 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IWICMetadataQueryReader "{30989668-E1C9-4597-B395-458EEDB808DF}" #usecom global IWICMetadataQueryReader IID_IWICMetadataQueryReader "{}" #comfunc global IWICMetadataQueryReader_GetContainerFormat 3 sptr #comfunc global IWICMetadataQueryReader_GetLocation 4 int,sptr,sptr #comfunc global IWICMetadataQueryReader_GetMetadataByName 5 wstr,sptr #comfunc global IWICMetadataQueryReader_GetEnumerator 6 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。