Freigeben über


Auflisten von Effekten und Übergängen

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

[Diese API wird nicht unterstützt und kann in Zukunft geändert oder nicht mehr verfügbar sein.]

DirectShow stellt ein System Device Enumerator-Objekt zum Auflisten von Geräten bereit. Sie können es verwenden, um Moniker für Effekte oder Übergänge abzurufen, die auf dem System des Benutzers installiert sind.

Der Systemgeräte-Enumerator macht die ICreateDevEnum-Schnittstelle verfügbar. Es gibt Kategorieenumeratoren für angegebene Gerätekategorien zurück. Ein Kategorieenumerator macht wiederum die IEnumMoniker-Schnittstelle verfügbar und gibt Moniker für jedes Gerät in der Kategorie zurück. Eine ausführliche Erläuterung zur Verwendung von ICreateDevEnum finden Sie unter Auflisten von Geräten und Filtern. Es folgt eine kurze Zusammenfassung, die speziell für DirectShow Editing Services gilt.

Führen Sie die folgenden Schritte aus, um Effekte oder Übergänge aufzulisten.

  1. Erstellen Sie eine instance des Systemgeräte-Enumerators.
  2. Rufen Sie die ICreateDevEnum::CreateClassEnumerator-Methode auf, um einen Kategorieumerator abzurufen. Kategorien werden durch Klassenbezeichner (CLSIDs) definiert. Verwenden Sie CLSID_VideoEffects1Category für Effekte oder CLSID_VideoEffects2Category für Übergänge.
  3. Rufen Sie IEnumMoniker::Next auf, um jeden Moniker in der Enumeration abzurufen.
  4. Rufen Sie für jeden Moniker IMoniker::BindToStorage auf, um den zugehörigen Eigenschaftenbehälter abzurufen.

Der Eigenschaftenbehälter enthält den Anzeigenamen und den global eindeutigen Bezeichner (GUID) für den Effekt oder Übergang. Eine Anwendung kann eine Liste von Anzeigenamen anzeigen und dann die entsprechende GUID abrufen.

Im folgenden Codebeispiel werden diese Schritte veranschaulicht.

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();

Arbeiten mit Effekten und Übergängen