Énumération des effets et des transitions
[Cette API n’est pas prise en charge et peut être modifiée ou non disponible à l’avenir.]
DirectShow fournit un objet énumérateur de périphérique système pour l’énumération des appareils. Vous pouvez l’utiliser pour récupérer les monikers des effets ou des transitions installés sur le système de l’utilisateur.
L’énumérateur de périphérique système expose l’interface ICreateDevEnum . Elle retourne les énumérateurs de catégorie pour les catégories d’appareils spécifiées. Un énumérateur de catégorie, à son tour, expose l’interface IEnumMoniker et retourne des monikers pour chaque appareil de la catégorie. Pour une présentation détaillée de l’utilisation de ICreateDevEnum, consultez énumération d’appareils et de filtres. voici un bref résumé, propre à DirectShow Services d’édition.
Pour énumérer des effets ou des transitions, procédez comme suit.
- Créez une instance de l’énumérateur du périphérique système.
- Appelez la méthode ICreateDevEnum :: CreateClassEnumerator pour récupérer un énumérateur de catégorie. Les catégories sont définies par des identificateurs de classe (CLSID). Utilisez CLSID _ VideoEffects1Category pour les effets ou les _ VideoEffects2Category CLSID pour les transitions.
- Appelez IEnumMoniker :: Next pour récupérer chaque moniker dans l’énumération.
- Pour chaque moniker, appelez IMoniker :: BindToStorage pour récupérer son conteneur de propriétés associé.
Le conteneur de propriétés contient le nom convivial et l’identificateur global unique (GUID) de l’effet ou de la transition. Une application peut afficher une liste de noms conviviaux, puis obtenir le GUID correspondant.
L’exemple de code suivant illustre ces étapes.
ICreateDevEnum *pCreateDevEnum = NULL;
IEnumMoniker *pEnumMoniker = NULL;
// Create the System Device Enumerator.
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pCreateDevEnum);
if (FAILED(hr))
{
// Error handling omitted for clarity.
}
// Create an enumerator for the video effects category.
hr = pCreateDevEnum->CreateClassEnumerator(
CLSID_VideoEffects1Category, // Video effects category.
&pEnumMoniker, 0);
// Note: Use CLSID_VideoEffects2Category for video transitions.
if (hr == S_OK) // S_FALSE means the category is empty.
{
// Enumerate each video effect.
IMoniker *pMoniker;
while (S_OK == pEnumMoniker->Next(1, &pMoniker, NULL))
{
IPropertyBag *pBag;
hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
(void **)&pBag);
if(FAILED(hr))
{
pMoniker->Release();
continue; // Maybe the next one will work.
}
VARIANT var;
VariantInit(&var);
hr = pBag->Read(OLESTR("FriendlyName"), &var, NULL);
if (SUCCEEDED(hr))
{
if ( ... ) // Check if var.bstrVal is the name you want.
{
VARIANT var2;
GUID guid;
var2.vt = VT_BSTR;
pBag->Read(OLESTR("guid"), &var2, NULL);
CLSIDFromString(var2.bstrVal, &guid);
VariantClear(&var2);
// GUID is now the CLSID for the effect.
}
}
VariantClear(&var);
pBag->Release();
pMoniker->Release();
}
pEnumMoniker->Release();
}
pCreateDevEnum->Release();