atributo MF_PD_ASF_LANGLIST
Especifica uma lista de identificadores de idioma que especifica os idiomas contidos em um arquivo ASF (Advanced Systems Format). Esse atributo corresponde ao Objeto de Lista de Idiomas, definido na especificação do ASF.
Tipo de dados
Matriz de bytes
Comentários
Esse atributo se aplica a descritores de apresentação para conteúdo ASF.
O método IMFASFContentInfo::GeneratePresentationDescriptor cria o descritor de apresentação e gera esse atributo a partir do cabeçalho Objeto da Lista de Idiomas. A tabela a seguir mostra o formato do blob:
Campo Objeto de Lista de Idiomas | Tipo de dados | Tamanho | Descrição |
---|---|---|---|
Contagem de registros de ID de idioma | DWORD | 4 bytes | Número de idiomas |
Registros de ID do idioma | BYTE[] | Varia | Matriz de cadeias de caracteres de linguagem (veja abaixo). |
O primeiro DWORD é o número de idiomas, seguido por uma matriz de cadeias de caracteres de identificador de idioma. Cada cadeia de caracteres tem o seguinte formato:
Campo Objeto de Lista de Idiomas | Tipo de dados | Tamanho | Descrição |
---|---|---|---|
Comprimento da ID do idioma | DWORD | 4 bytes | O comprimento da cadeia de caracteres em bytes, incluindo o tamanho do caractere NULL à direita. |
ID do idioma | WCHAR[] | Varia | Uma cadeia de caracteres terminada em nulo que contém o nome do idioma RFC 1766. |
Cada cadeia de caracteres é uma marca de idioma compatível com RFC 1766.
Para obter a marca de idioma de um fluxo específico no arquivo ASF, consulte o descritor de fluxo para o atributo MF_SD_ASF_EXTSTRMPROP_LANGUAGE_ID_INDEX .
Exemplos
O exemplo a seguir mostra como analisar a lista de idiomas.
class LanguageList
{
private:
UINT8 *pRawList; // Unparsed blob
UINT32 cbList; // Size of the blob, in bytes
DWORD cLangs; // Number of languages
WCHAR **ppszLanguages; // Array of pointers to strings.
// These are pointers into pRawList.
public:
LanguageList() :
pRawList(NULL), cbList(0), ppszLanguages(NULL), cLangs(0)
{
}
~LanguageList()
{
Clear();
}
// Clear: Clears the list.
void Clear()
{
CoTaskMemFree(pRawList);
cbList = 0;
cLangs = 0;
delete [] ppszLanguages;
ppszLanguages = NULL;
}
// GetCount: Returns the number of languages.
DWORD GetCount() const { return cLangs; }
// GetLanguage: Return the i'th string in the list.
const WCHAR* GetLanguage(DWORD i)
{
if (i >= cLangs)
{
return NULL;
}
return ppszLanguages[i];
}
// Initialize: Get the language list, if specified, and parse it.
HRESULT Initialize(IMFPresentationDescriptor *pPD)
{
if (pPD == NULL)
{
return E_POINTER;
}
Clear();
HRESULT hr = pPD->GetAllocatedBlob(
MF_PD_ASF_LANGLIST, &pRawList, &cbList);
if (FAILED(hr))
{
goto done;
}
// Parse the language blob.
// Record count.
if (cbList < sizeof(DWORD))
{
hr = E_FAIL;
goto done;
}
cLangs = ((DWORD*)pRawList)[0];
// Allocate an array of pointers to language strings.
ppszLanguages = new (std::nothrow) WCHAR*[cLangs];
if (ppszLanguages == NULL)
{
hr = E_OUTOFMEMORY;
goto done;
}
ZeroMemory(ppszLanguages, cLangs * sizeof(WCHAR*));
BYTE *pNext = pRawList + sizeof(DWORD); // Next byte.
BYTE *pEnd = pRawList + cbList; // End of the blob.
for (DWORD i = 0; i < cLangs; i++)
{
if (pNext > pEnd - sizeof(DWORD))
{
hr = E_FAIL;
goto done;
}
// Language ID length
DWORD cbStr = ((DWORD*)pNext)[0];
pNext += sizeof(DWORD);
// Calculate the pointer to the language ID string.
if ((cbStr > (size_t)(pEnd - pNext)) ||
(cbStr < sizeof(WCHAR)) ||
(cbStr % sizeof(WCHAR) != 0))
{
hr = E_FAIL;
goto done;
}
ppszLanguages[i] = (WCHAR*)pNext;
// Verify the string is NULL-terminated.
if (ppszLanguages[i][(cbStr / sizeof(WCHAR)) - 1] != L'\0')
{
hr = E_FAIL;
goto done;
}
pNext += cbStr;
}
done:
if (FAILED(hr))
{
Clear();
}
if (hr == MF_E_ATTRIBUTENOTFOUND)
{
// There was no language list attribute in the PD.
// This is not a failure case.
hr = S_OK;
}
return hr;
}
private:
LanguageList(const LanguageList& lang);
LanguageList& operator=(const LanguageList& lang);
};
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte |
Windows Vista [somente aplicativos da área de trabalho] |
Servidor mínimo com suporte |
Windows Server 2008 [somente aplicativos da área de trabalho] |
Cabeçalho |
|
Confira também
-
Objeto de cabeçalho ASF