attribut MF_PD_ASF_LANGLIST
Spécifie une liste d’identificateurs de langue qui spécifie les langues contenues dans un fichier ASF (Advanced Systems Format). Cet attribut correspond à l’objet Language List, défini dans la spécification ASF.
Type de données
Tableau d’octets
Notes
Cet attribut s’applique aux descripteurs de présentation pour le contenu ASF.
La méthode IMFASFContentInfo::GeneratePresentationDescriptor crée le descripteur de présentation et génère cet attribut à partir de l’en-tête Language List Object. Le tableau suivant montre le format de l’objet blob :
Champ Language List Object | Type de données | Taille | Description |
---|---|---|---|
Nombre d’enregistrements d’ID de langue | DWORD | 4 octets | Nombre de langues |
Enregistrements d’ID de langue | BYTE[] | Variable | Tableau de chaînes de langage (voir ci-dessous). |
Le premier DWORD correspond au nombre de langues, suivi d’un tableau de chaînes d’identificateur de langue. Chaque chaîne a le format suivant :
Champ Language List Object | Type de données | Taille | Description |
---|---|---|---|
Longueur de l’ID de langue | DWORD | 4 octets | Longueur de la chaîne en octets, y compris la taille du caractère NULL de fin. |
ID de langue | WCHAR[] | Variable | Chaîne terminée par null contenant le nom du langage RFC 1766. |
Chaque chaîne est une balise de langue conforme à la norme RFC 1766.
Pour obtenir la balise de langue d’un flux particulier dans le fichier ASF, interrogez le descripteur de flux pour l’attribut MF_SD_ASF_EXTSTRMPROP_LANGUAGE_ID_INDEX .
Exemples
L’exemple suivant montre comment analyser la liste des langues.
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);
};
Spécifications
Condition requise | Valeur |
---|---|
Client minimal pris en charge |
Windows Vista [applications de bureau uniquement] |
Serveur minimal pris en charge |
Windows Server 2008 [applications de bureau uniquement] |
En-tête |
|
Voir aussi
-
Objet d’en-tête ASF
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour