使用複雜的中繼資料屬性
[與此頁面相關聯的功能 Windows Media Format 11 SDK是舊版功能。 來源讀取器和接收寫入器已取代它。 來源讀取器和接收寫入器已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用來源讀取器和接收寫入器,而不是Windows 媒體格式 11 SDK。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
Windows 媒體格式 SDK 支援複雜的中繼資料屬性,這些屬性具有結構所代表的值。 因為所有屬性都必須在 WMT_ATTR_DATATYPE 列舉中定義資料類型,所以所有複雜的中繼資料屬性都會被視為 WMT_TYPE_BINARY。 撰寫複雜屬性時,將指標轉換成 結構做為位元組指標。 當您擷取複雜屬性時,請將 IWMHeaderInfo3::GetAttributeByIndexEx 所設定的位元組陣列轉換成適當的結構。
下列程式碼範例示範如何設定和擷取複雜的中繼資料屬性。 第一個函式會新增使用者文字屬性,第二個函式會擷取一個。 如需如何使用這些範例的詳細資訊,請參閱 使用程式碼範例。
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;
}
相關主題