複雑なメタデータ属性の使用
[このページに関連付けられている機能である Windows Media Format 11 SDK は、従来の機能です。 ソース リーダーとシンク ライターに置き換わりました。 ソース リーダーとシンク ライターは、Windows 10とWindows 11用に最適化されています。 Microsoft では、可能であれば、新しいコードで Windows Media Format 11 SDK ではなくソース リーダーとシンク ライターを使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
Windows Media Format SDK では、複雑なメタデータ属性がサポートされています。これは、構造体によって表される値を持つ属性です。 すべての属性には 、WMT_ATTR_DATATYPE 列挙で定義されたデータ型が必要であるため、すべての複雑なメタデータ属性は WMT_TYPE_BINARYとして扱われます。 複合属性を書き込む場合は、ポインターをバイト ポインターとして構造体にキャストします。 複合属性を取得する場合は、 IWMHeaderInfo3::GetAttributeByIndexEx によって設定されたバイト配列を適切な構造体としてキャストします。
次のコード例は、複雑なメタデータ属性を設定および取得する方法を示しています。 最初の関数はユーザー テキスト属性を追加し、2 番目の関数はユーザー テキスト属性を取得します。 これらの例の使用方法の詳細については、「 コード例の使用」を参照してください。
HRESULT AddText(IWMHeaderInfo3* pHeaderInfo,
WCHAR* pwszDesc,
WCHAR* pwszText,
WORD* pwIndex)
{
HRESULT hr = S_OK;
WORD wIndex = 0;
WM_USER_TEXT textStruct;
// Populate the text structure.
textStruct.pwszDescription = pwszDesc;
textStruct.pwszText = pwszText;
// Add the attribute.
hr = pHeaderInfo->AddAttribute(0,
g_wszWMText,
&wIndex,
WMT_TYPE_BINARY,
0,
(BYTE*)&textStruct,
sizeof(WM_USER_TEXT));
// Pass the index of the text attribute back to the caller.
if(SUCCEEDED(hr))
{
*pwIndex = wIndex;
}
return hr;
}
HRESULT DisplayText(IWMHeaderInfo3* pHeaderInfo, WORD wIndex)
{
HRESULT hr = S_OK;
WCHAR* pwszName = NULL;
WORD cchName = 0;
WORD Language = 0;
BYTE* pbValue = NULL;
DWORD cbValue = 0;
WM_USER_TEXT* pText = NULL;
WMT_ATTR_DATATYPE AttType;
// Find the lengths of the attribute name and value.
hr = pHeaderInfo->GetAttributeByIndexEx(0,
wIndex,
NULL,
&cchName,
NULL,
NULL,
NULL,
&cbValue);
GOTO_EXIT_IF_FAILED(hr);
// Allocate memory for the name and value.
pwszName = new WCHAR[cchName];
pbValue = new BYTE[cbValue];
if(pwszName == NULL || pbValue == NULL)
{
hr = E_OUTOFMEMORY;
goto Exit;
}
// Get the attribute.
hr = pHeaderInfo->GetAttributeByIndexEx(0,
wIndex,
pwszName,
&cchName,
&AttType,
&Language,
pbValue,
&cbValue);
GOTO_EXIT_IF_FAILED(hr);
// Make sure the attribute is WM/Text, as expected.
if(wcscmp(pwszName, g_wszWMText))
{
// Somehow we got the wrong attribute.
hr = E_UNEXPECTED;
goto Exit;
}
// Set the structure pointer to the retrieved value.
pText = (WM_USER_TEXT*) pbValue;
// Print the strings from the structure.
printf("Description : %S\n", pText->pwszDescription);
printf("Text : %S\n", pText->pwszText);
Exit:
SAFE_ARRAY_DELETE(pwszName);
SAFE_ARRAY_DELETE(pbValue);
return hr;
}
関連トピック