擷取檔案中的所有中繼資料
[與此頁面相關聯的功能 Windows Media Format 11 SDK是舊版功能。 來源讀取器和接收寫入器已取代它。 來源讀取器和接收寫入器已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用來源讀取器和接收寫入器,而不是Windows 媒體格式 11 SDK。 Microsoft 建議使用舊版 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;
}
相關主題