ファイル内のすべてのメタデータを取得するには
[このページに関連付けられている機能である Windows Media Format 11 SDK は、レガシ機能です。 これは、ソース リーダーとシンク ライターによって置き換えられます。 ソース リーダーとシンク ライターは、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、Windows Media Format 11 SDK ではなくソース リーダーとシンク ライターを使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
次のコード例は、ファイル内のすべてのメタデータを表示する関数です。 関数を使用するには、メタデータ エディター オブジェクト、リーダー オブジェクト、同期リーダー オブジェクト、またはライター オブジェクトの IWMHeaderInfo3 インターフェイスへのポインターを渡す必要があります。 また、Stdio.h ヘッダー ファイルをプロジェクトのどこかに含める必要があります。 この例の使用方法の詳細については、「 コード例の使用」を参照してください。
わかりやすくするために、この例ではバイナリ属性と GUID 属性の値は表示されません。 バイナリ属性の場合は、属性名が既知の複雑なメタデータ属性のいずれかと一致するかどうかを確認チェック必要があります。 その場合は、その属性に使用される構造に従って出力を書式設定する必要があります。 同様に、GUID 属性値はさまざまな方法で表示できます。 構造体の各メンバーを一度に 1 つずつ表示するか、構造体を文字列に変換して 1 つの値として表示することを選択できます。
HRESULT ShowAllAttributes(IWMHeaderInfo3* pHeaderInfo)
{
HRESULT hr = S_OK;
WORD cAttributes = 0;
WCHAR* pwszName = NULL;
WORD cchName = 0;
BYTE* pbValue = NULL;
DWORD cbValue = 0;
WORD langIndex = 0;
WORD attIndex = 0;
WMT_ATTR_DATATYPE attType;
// Get the total number of attributes in the file.
hr = pHeaderInfo->GetAttributeCountEx(0xFFFF, &cAttributes);
GOTO_EXIT_IF_FAILED(hr);
// Loop through all the attributes, retrieving and displaying each.
for(attIndex = 0; attIndex < cAttributes; attIndex++)
{
// Get the required buffer lengths for the name and value.
hr = pHeaderInfo->GetAttributeByIndexEx(0xFFFF,
attIndex,
NULL,
&cchName,
NULL,
NULL,
NULL,
&cbValue);
GOTO_EXIT_IF_FAILED(hr);
// Allocate the buffers.
pwszName = new WCHAR[cchName];
if(pwszName == NULL)
{
hr = E_OUTOFMEMORY;
goto Exit;
}
pbValue = new BYTE[cbValue];
if(pbValue == NULL)
{
hr = E_OUTOFMEMORY;
goto Exit;
}
// Get the attribute.
hr = pHeaderInfo->GetAttributeByIndexEx(0xFFFF,
attIndex,
pwszName,
&cchName,
&attType,
&langIndex,
pbValue,
&cbValue);
GOTO_EXIT_IF_FAILED(hr);
// Display the attribute global index and name.
printf("%3d - %S (Language %d):\n\t ", attIndex, pwszName, langIndex);
// Display the attribute depending upon type.
switch(attType)
{
case WMT_TYPE_DWORD:
case WMT_TYPE_QWORD:
case WMT_TYPE_WORD:
printf("%d\n\n", (DWORD) *pbValue);
break;
case WMT_TYPE_STRING:
printf("%S\n\n", (WCHAR*) pbValue);
break;
case WMT_TYPE_BINARY:
printf("<binary value>\n\n");
break;
case WMT_TYPE_BOOL:
printf("%s\n\n", ((BOOL) *pbValue == TRUE) ? "True" : "False");
break;
case WMT_TYPE_GUID:
printf("<GUID value>\n\n", (DWORD) *pbValue);
break;
}
// Release allocated memory for the next pass.
SAFE_ARRAY_DELETE(pwszName);
SAFE_ARRAY_DELETE(pbValue);
cchName = 0;
cbValue = 0;
} // End for attIndex.
Exit:
SAFE_ARRAY_DELETE(pwszName);
SAFE_ARRAY_DELETE(pbValue);
return hr;
}
関連トピック