Получение всех метаданных в файле
[Функция, связанная с этой страницей, Windows Media Format 11 SDK, является устаревшей функцией. Он был заменен средством чтения исходного кода и модуля записи приемника. Средство чтения исходного кода и модуль записи приемника оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код по возможности использовал средство чтения исходного кода и модуль записи приемника вместо пакета SDK для Windows Media Format 11. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]
В следующем примере кода показана функция, которая отображает все метаданные в файле. Чтобы использовать функцию, необходимо передать ей указатель на интерфейс IWMHeaderInfo3 объекта редактора метаданных, объекта средства чтения, синхронного объекта чтения или объекта записи. В проект также необходимо включить файл заголовка Stdio.h. Дополнительные сведения об использовании этого примера см. в разделе Использование примеров кода.
Для ясности в этом примере не отображаются значения двоичных атрибутов и атрибутов GUID. Для двоичных атрибутов следует проверка, чтобы узнать, соответствует ли имя атрибута любому из известных сложных атрибутов метаданных. Если это так, необходимо отформатировать выходные данные в соответствии со структурой, используемой для этого атрибута. Аналогичным образом значения атрибутов GUID могут отображаться несколькими способами. Вы можете отобразить каждый элемент структуры по одному или преобразовать структуру в строку и отобразить ее в виде одного значения.
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;
}
Связанные темы