IWMDMStorage3::GetMetadata メソッド (mswmdm.h)
GetMetadata メソッドは、ストレージに関連付けられているメタデータを取得します。
構文
HRESULT GetMetadata(
[out] IWMDMMetaData **ppMetadata
);
パラメーター
[out] ppMetadata
ストレージに関連付けられている IWMDMMetaData ポインターへのポインター。 呼び出し元は、デバイス形式機能の検出に関するページの「割り当てられたメモリのクリア」で説明されているように、このインターフェイスで Release を呼び出す役割を担います。
戻り値
このメソッドは HRESULT を返します。 Windows Media デバイス マネージャーのすべてのインターフェイス メソッドは、次のいずれかのエラー コード クラスを返すことができます。
- 標準 COM エラー コード
- HRESULT 値に変換された Windows エラー コード
- Windows Media デバイス マネージャー エラー コード
注釈
このメソッドは、ストレージに関連付けられているすべてのメタデータを取得します。 アプリケーションが特定のメタデータをシークしている場合は、 IWMDMStorage4::GetSpecifiedMetadata を呼び出す方が効率的な場合があります。
Windows ポータブル デバイス (WPD) デバイスからデータを取得すると、データはバイナリ形式で返されます。 アプリケーションでは、実際のプロパティ値を取得するために、このデータをシリアル化解除する必要があります。
例
次の C++ 関数は、ストレージに関連付けられているすべてのメタデータを取得します。
// Function to print out all the metadata associated with a storage.
HRESULT CWMDMController::GetMetadata(IWMDMStorage *pStorage)
{
HRESULT hr = S_OK;
// A dummy loop to handle unrecoverable errors. When we hit an error we
// can't handle or don't like, we just use a 'break' statement.
// The custom BREAK_HR macro checks for failed HRESULT values and does this.
do
{
CComPtr<IWMDMStorage3> pStorage3;
CComPtr<IWMDMMetaData> pMetadata;
hr = pStorage->QueryInterface(__uuidof(IWMDMStorage3), (void**)&pStorage3);
BREAK_HR(hr, "Got an IWMDMStorage3 interface in GetMetadata.", "Couldn't get an IWMDMStorage3 interface in GetMetadata.");
hr = pStorage3->GetMetadata(&pMetadata);
BREAK_HR(hr, "Got an IWMDMMetaData interface in GetMetadata.", "Couldn't get an IWMDMMetaData interface in GetMetadata.");
//
// Loop through all metadata properties, and print out the value of each.
//
BYTE* value;
WMDM_TAG_DATATYPE type;
UINT len = 0;
UINT count = 0;
WCHAR* name;
// Get the number of metadata items.
hr = pMetadata->GetItemCount(&count);
BREAK_HR(hr, "Got a metadata count in GetMetadata.", "Couldn't get a metadata count in GetMetadata.");
for(;count > 0; count--)
{
// Get the metadata property by index.
WCHAR* name;
hr = pMetadata->QueryByIndex(count-1, &name, &type, &value, &len);
if (SUCCEEDED(hr))
{
// TODO: Display the property name.
CoTaskMemFree(name);
// Print out the value of the property, according to the value type.
switch (type)
{
case WMDM_TYPE_QWORD:
case WMDM_TYPE_DWORD:
case WMDM_TYPE_WORD:
// TODO: Display the value.
break;
case WMDM_TYPE_STRING:
// TODO: Display the value.
// Release the method-allocated property value memory.
if (SUCCEEDED(hr))
CoTaskMemFree(value);
break;
case WMDM_TYPE_BOOL:
// TODO: Display the value.
break;
case WMDM_TYPE_BINARY:
// TODO: Display the value.
break;
case WMDM_TYPE_DATE:
{
WMDMDATETIME *val = (WMDMDATETIME*)value;
// TODO: Display the month, day, and year.
}
break;
case WMDM_TYPE_GUID:
{
WCHAR strGuid[64];
StringFromGUID2(reinterpret_cast<GUID&>(value),(LPOLESTR)strGuid, 64);
// TODO: Display the GUID value.
}
break;
default:
// TODO: Display the message: "Could not understand the returned value type
}
}
else // Couldn't get the metadata property at index count - 1.
// TODO: Display the message:
// "Couldn't get a value for index "
// followed by the current index value.
}
// Now get a specific property by name.
// If this property isn't supported, the method returns E_INVALIDARG.
hr = pMetadata->QueryByName(g_wszWMDMFileName, &type, &value, &len);
if (hr == S_OK)
{
wstring wstr((wchar_t*)value, len / 2); // Create a string from the name.
// TODO: Display the file name.
CoTaskMemFree(value);
}
// See if file is DRM-protected.
hr = pMetadata->QueryByName(g_wszWMDMIsProtected, &type, &value, &len);
if (hr == S_OK)
{
// TODO: Display a message that the object is DRM protected.
}
}while(FALSE);// End of dummy loop.
// Clean up and return.
return hr;
}
要件
要件 | 値 |
---|---|
対象プラットフォーム | Windows |
ヘッダー | mswmdm.h |
Library | Mssachlp.lib |