Freigeben über


Entfernen aller Filter im Diagramm

[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.]

Die einfachste Möglichkeit, alle Filter in einem Filterdiagramm zu entfernen, besteht darin, den Filtergraph-Manager zu freigeben und einen neuen zu erstellen. Stellen Sie sicher, dass Sie jeden Zeiger, über den Ihre Anwendung verfügt, auf alle Schnittstellen im Filterdiagramm-Manager sowie auf Objekte im Graphen freigeben, einschließlich Filtern, Pins, der Referenzuhr usw.

Alternativ können Sie die Filter einzeln mit der IFilterGraph::RemoveFilter-Methode entfernen:

// Stop the graph.
pControl->Stop();

// Enumerate the filters in the graph.
IEnumFilters *pEnum = NULL;
HRESULT hr = pGraph->EnumFilters(&pEnum);
if (SUCCEEDED(hr))
{
    IBaseFilter *pFilter = NULL;
    while (S_OK == pEnum->Next(1, &pFilter, NULL))
     {
         // Remove the filter.
         pGraph->RemoveFilter(pFilter);
         // Reset the enumerator.
         pEnum->Reset();
         pFilter->Release();
    }
    pEnum->Release();
}

In diesem Beispiel wird die IFilterGraph::EnumFilters-Methode verwendet, um die Filter im Diagramm aufzulisten. Das Entfernen eines Filters führt dazu, dass das Enumeratorobjekt nicht mehr mit dem Diagramm synchronisiert wird. Verwenden Sie die IEnumFilters::Reset-Methode , um den Enumerator zurückzusetzen. Andernfalls schlägt jeder nachfolgende Aufruf von IEnumFilters::Next fehl.