IWMDMStorage3::GetMetadata 메서드(mswmdm.h)
GetMetadata 메서드는 스토리지와 연결된 메타데이터를 검색합니다.
구문
HRESULT GetMetadata(
[out] IWMDMMetaData **ppMetadata
);
매개 변수
[out] ppMetadata
스토리지와 연결된 IWMDMMetaData 포인터에 대한 포인터입니다. 호출자는 디바이스 형식 기능 검색의 "할당된 메모리 지우기"에 설명된 대로 이 인터페이스에서 Release 및 할당된 모든 값을 호출합니다.
반환 값
이 메서드는 HRESULT를 반환합니다. Windows Media 장치 관리자 모든 인터페이스 메서드는 다음 오류 코드 클래스를 반환할 수 있습니다.
- 표준 COM 오류 코드
- HRESULT 값으로 변환된 Windows 오류 코드
- Windows Media 장치 관리자 오류 코드
설명
이 메서드는 스토리지와 연결된 모든 메타데이터를 검색합니다. 애플리케이션이 특정 메타데이터를 검색하는 경우 IWMDMStorage4::GetSpecifiedMetadata를 호출하는 것이 더 효율적일 수 있습니다.
WPD(Windows Portable Devices) 디바이스에서 데이터를 검색할 때 데이터는 이진 형식으로 반환됩니다. 애플리케이션은 실제 속성 값을 얻기 위해 이 데이터를 직렬화 해제해야 합니다.
예제
다음 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 |
라이브러리 | Mssachlp.lib |