Per recuperare tutti i metadati in un file
[La funzionalità associata a questa pagina, Windows Media Format 11 SDK, è una funzionalità legacy. È stata sostituita dal lettore di origine e dal 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.
L'esempio di codice seguente è una funzione che visualizza tutti i metadati in un file. Per usare la funzione, è necessario passarlo un puntatore all'interfaccia IWMHeaderInfo3 di un oggetto editor di metadati, un oggetto lettore, un oggetto lettore sincrono o un oggetto writer. È inoltre necessario includere il file di intestazione Stdio.h in un punto qualsiasi del progetto. Per altre informazioni su come usare questo esempio, vedere Uso degli esempi di codice.
Per maggiore chiarezza, in questo esempio non vengono visualizzati i valori degli attributi binari e GUID. Per gli attributi binari, è necessario verificare se il nome dell'attributo corrisponde a uno degli attributi di metadati complessi noti. In tal caso, è necessario formattare l'output in base alla struttura usata per tale attributo. Analogamente, i valori degli attributi GUID possono essere visualizzati in diversi modi. È possibile scegliere di visualizzare ogni membro della struttura uno alla volta o convertire la struttura in una stringa e visualizzarla come un valore.
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;
}
Argomenti correlati