IWMDMMetaData
COM公式ドキュメント
IWMDMMetaData インターフェイスは、ストレージのメタデータ プロパティ (アーティスト、アルバム、ジャンルなど) を設定および取得します。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
AddItem メソッドは、メタデータ プロパティをインターフェイスに追加します。
| Type | WMDM_TAG_DATATYPE | in | 保存するメタデータの型を指定する WMDM_TAG_DATATYPE 列挙値。 |
| pwszTagName | LPWSTR | in | 設定するプロパティの名前を指定する、ワイド文字の null 終端文字列へのポインター。標準のプロパティ名定数の一覧については、Metadata Constants を参照してください。 |
| pValue | BYTE* | inoptional | プロパティに割り当てる値を指定するバイト配列へのポインター。指定した値はコピーされるため、AddItem の呼び出し後にメモリを解放できます。 |
| iLength | DWORD | in | pValue のサイズ (バイト単位) を指定する整数。 |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェイス メソッドは、次の種類のエラー コードを返す可能性があります。
- 標準の COM エラー コード
- HRESULT 値に変換された Windows エラー コード
- Windows Media Device Manager のエラー コード
QueryByName メソッドは、名前で指定されたプロパティの値を取得します。
| pwszTagName | LPWSTR | in | プロパティ名を指定する、ワイド文字の null 終端文字列へのポインター。標準のプロパティ名定数の一覧については、Metadata Constants を参照してください。 |
| pType | WMDM_TAG_DATATYPE* | out | pValue で取得されるデータの型を表す WMDM_TAG_DATATYPE 列挙値。 |
| pValue | BYTE** | out | メソッドが成功した場合に、値の内容を受け取るバイト配列へのポインターへのポインター。このメモリは Windows Media Device Manager によって割り当てられるため、呼び出し元が CoTaskMemFree を使用して解放する必要があります。 |
| pcbLength | DWORD* | out | バイト配列 ppValue のサイズ (バイト単位) へのポインター。値が文字列の場合、これには終端文字が含まれます。 |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェイス メソッドは、次の種類のエラー コードを返す可能性があります。
- 標準の COM エラー コード
- HRESULT 値に変換された Windows エラー コード
- Windows Media Device Manager のエラー コード
QueryByIndex メソッドは、インデックスで指定されたプロパティの値を取得します。
| iIndex | DWORD | in | プロパティの 0 から始まるインデックスを指定する整数。項目数は GetItemCount の呼び出しによって取得します。 |
| ppwszName | WORD** | out | プロパティの名前。このメモリは Windows Media Device Manager によって割り当てられるため、呼び出し元が CoTaskMemFree を使用して解放する必要があります。 |
| pType | WMDM_TAG_DATATYPE* | out | ppValue で返されるデータの型を表す WMDM_TAG_DATATYPE 列挙値。 |
| ppValue | BYTE** | out | メソッドが成功した場合に、値の内容を受け取るバイト配列へのポインターへのポインター。このメモリは Windows Media Device Manager によって割り当てられるため、呼び出し元が CoTaskMemFree を使用して解放する必要があります。 |
| pcbLength | DWORD* | out | バイト配列 ppValue のサイズ (バイト単位) へのポインター。値が文字列の場合、これには終端文字が含まれます。 |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェイス メソッドは、次の種類のエラー コードを返す可能性があります。
- 標準の COM エラー コード
- HRESULT 値に変換された Windows エラー コード
- Windows Media Device Manager のエラー コード
GetItemCount メソッドは、インターフェイスが保持しているプロパティの総数を取得します。
| iCount | DWORD* | out | インターフェイスに格納されているメタデータ プロパティの総数を受け取る整数へのポインター。 |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェイス メソッドは、次の種類のエラー コードを返す可能性があります。
- 標準の COM エラー コード
- HRESULT 値に変換された Windows エラー コード
- Windows Media Device Manager のエラー コード
解説(Remarks)
このメソッドは、QueryByIndex と組み合わせて、ストレージまたはデバイス上のすべてのプロパティを列挙するために使用できます。
例
次のコードは、IWMDMMetaData インターフェイス (pMetadata) に含まれるプロパティの数を取得し、それらをすべてインデックスで取得して表示しようとします。カスタムのエラー処理マクロ BREAK_HR を使用しています。
//
// すべてのメタデータ プロパティをループ処理し、それぞれの値を表示します。
//
BYTE* value;
WMDM_TAG_DATATYPE type;
UINT len = 0;
UINT count = 0;
WCHAR* name;
// メタデータ項目の数を取得します。
hr = pMetadata->GetItemCount(&count);
BREAK_HR(hr, "GetMetadata でメタデータの数を取得しました。", "GetMetadata でメタデータの数を取得できませんでした。");
for(;count > 0; count--)
{
// メタデータ プロパティをインデックスで取得します。
WCHAR* name;
hr = pMetadata->QueryByIndex(count-1, &name, &type, &value, &len);
if (SUCCEEDED(hr))
{
// TODO: プロパティ名を表示します。
CoTaskMemFree(name);
// 値の型に応じて、プロパティの値を表示します。
switch (type)
{
case WMDM_TYPE_QWORD:
case WMDM_TYPE_DWORD:
case WMDM_TYPE_WORD:
// TODO: 値を表示します。
break;
case WMDM_TYPE_STRING:
// TODO: 値を表示します。
// メソッドが割り当てたプロパティ値のメモリを解放します。
if (SUCCEEDED(hr))
CoTaskMemFree(value);
break;
case WMDM_TYPE_BOOL:
// TODO: 値を表示します。
break;
case WMDM_TYPE_BINARY:
// TODO: 値を表示します。
break;
case WMDM_TYPE_DATE:
{
WMDMDATETIME *val = (WMDMDATETIME*)value;
/ /TODO: 月、日、年を表示します。
}
break;
case WMDM_TYPE_GUID:
{
WCHAR strGuid[64];
StringFromGUID2(reinterpret_cast<GUID&>(value),(LPOLESTR)strGuid, 64);
/ /TODO: GUID を表示します。
}
break;
default:
// TODO: 返された値の型をアプリケーションが解釈できなかったことを
// 示すメッセージを表示します。
}
}
else // インデックス count - 1 のメタデータ プロパティを取得できませんでした。
// TODO: そのインデックスの値をアプリケーションが取得できなかったことを
// 示すメッセージを表示します。
// WMDM が割り当てたメモリをクリアします。
if (value)
CoTaskMemFree(value);
}
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IWMDMMetaData "{EC3B0663-0951-460A-9A80-0DCEED3C043C}" #usecom global IWMDMMetaData IID_IWMDMMetaData "{}" #comfunc global IWMDMMetaData_AddItem 3 int,wstr,var,int #comfunc global IWMDMMetaData_QueryByName 4 wstr,var,var,var #comfunc global IWMDMMetaData_QueryByIndex 5 int,var,var,var,var #comfunc global IWMDMMetaData_GetItemCount 6 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IWMDMMetaData "{EC3B0663-0951-460A-9A80-0DCEED3C043C}" #usecom global IWMDMMetaData IID_IWMDMMetaData "{}" #comfunc global IWMDMMetaData_AddItem 3 int,wstr,sptr,int #comfunc global IWMDMMetaData_QueryByName 4 wstr,sptr,sptr,sptr #comfunc global IWMDMMetaData_QueryByIndex 5 int,sptr,sptr,sptr,sptr #comfunc global IWMDMMetaData_GetItemCount 6 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。