Uso di attributi di metadati complessi
[La funzionalità associata a questa pagina, Windows Media Format 11 SDK, è una funzionalità legacy. È stata sostituita da Lettore di origine e Writer sink. Lettore di origine e Writer sink sono stati ottimizzati per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi Lettore di origine e Writer sink anziché Windows Media Format 11 SDK, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.
Windows Media Format SDK supporta attributi di metadati complessi, che sono attributi che hanno valori rappresentati da una struttura. Poiché tutti gli attributi devono avere un tipo di dati definito nell'enumerazione WMT_ATTR_DATATYPE , tutti gli attributi di metadati complessi vengono considerati come WMT_TYPE_BINARY. Quando si scrive un attributo complesso, eseguire il cast del puntatore alla struttura come puntatore di byte. Quando si recupera un attributo complesso, eseguire il cast della matrice di byte impostata da IWMHeaderInfo3::GetAttributeByIndexEx come struttura appropriata.
Gli esempi di codice seguenti illustrano come impostare e recuperare un attributo di metadati complesso. La prima funzione aggiunge un attributo di testo utente, la seconda funzione recupera una. Per altre informazioni su come usare questi esempi, vedere Uso degli esempi di codice.
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;
}
Argomenti correlati