Freigeben über


Suchen einer Schnittstelle in einem Filter oder Anheften

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

Für viele Vorgänge in DirectShow ruft die Anwendung Methoden im Filter Graph-Manager auf. In einigen Situationen muss die Anwendung jedoch eine Methode direkt für einen Filter oder pin aufrufen. Beispielsweise machen viele Filter spezielle Schnittstellen verfügbar, die zum Konfigurieren des Filters verwendet werden.

Im Fall einer Filterschnittstelle verfügen Sie möglicherweise bereits über einen Zeiger auf die IBaseFilter-Schnittstelle des Filters. Verwenden Sie in diesem Fall einfach QueryInterface , um die andere Schnittstelle abzurufen. Einige Filter können dem Diagramm jedoch vom Filter graph-Manager hinzugefügt werden. (Ausführliche Informationen finden Sie unter Intelligent Connect.) Verwenden Sie in diesem Fall die IEnumFilters-Schnittstelle , um alle Filter im Graphen zu durchlaufen und nacheinander abzufragen. Die folgende Funktion veranschaulicht dies:

HRESULT FindFilterInterface(
    IGraphBuilder *pGraph, // Pointer to the Filter Graph Manager.
    REFGUID iid,           // IID of the interface to retrieve.
    void **ppUnk)          // Receives the interface pointer.
{
    if (!pGraph || !ppUnk) return E_POINTER;

    HRESULT hr = E_FAIL;
    IEnumFilters *pEnum = NULL;
    IBaseFilter *pF = NULL;
    if (FAILED(pGraph->EnumFilters(&pEnum)))
    {
        return E_FAIL;
    }
    // Query every filter for the interface.
    while (S_OK == pEnum->Next(1, &pF, 0))
    {
        hr = pF->QueryInterface(iid, ppUnk);
        pF->Release();
        if (SUCCEEDED(hr))
        {
            break;
        }
    }
    pEnum->Release();
    return hr;
}

Um eine Schnittstelle an einem Pin zu finden, verwenden Sie die IEnumPins-Schnittstelle , um die Pins in einem Filter zu durchlaufen. Die folgende Funktion zeigt, wie Sie dies tun:

HRESULT FindPinInterface(
    IBaseFilter *pFilter,  // Pointer to the filter to search.
    REFGUID iid,           // IID of the interface.
    void **ppUnk)          // Receives the interface pointer.
{
    if (!pFilter || !ppUnk) return E_POINTER;

    HRESULT hr = E_FAIL;
    IEnumPins *pEnum = 0;
    if (FAILED(pFilter->EnumPins(&pEnum)))
    {
        return E_FAIL;
    }
    // Query every pin for the interface.
    IPin *pPin = 0;
    while (S_OK == pEnum->Next(1, &pPin, 0))
    {
        hr = pPin->QueryInterface(iid, ppUnk);
        pPin->Release();
        if (SUCCEEDED(hr))
        {
            break;
        }
    }
    pEnum->Release();
    return hr;
}

Die nächste Funktion sucht nach einer Schnittstelle für einen Filter oder eine Pin:

HRESULT FindInterfaceAnywhere(
    IGraphBuilder *pGraph, 
    REFGUID iid, 
    void **ppUnk)
{
    if (!pGraph || !ppUnk) return E_POINTER;
    HRESULT hr = E_FAIL;
    IEnumFilters *pEnum = 0;
    if (FAILED(pGraph->EnumFilters(&pEnum)))
    {
        return E_FAIL;
    }
    // Loop through every filter in the graph.
    IBaseFilter *pF = 0;
    while (S_OK == pEnum->Next(1, &pF, 0))
    {
        hr = pF->QueryInterface(iid, ppUnk);
        if (FAILED(hr))
        {
            // The filter does not expose the interface, but maybe
            // one of its pins does.
            hr = FindPinInterface(pF, iid, ppUnk);
        }
        pF->Release();
        if (SUCCEEDED(hr))
        {
            break;
        }
    }
    pEnum->Release();
    return hr;
}

Beachten Sie, dass alle hier gezeigten Funktionen bei der ersten erfolgreichen QueryInterface beendet werden.

Auflisten von Filtern

Aufzählen von Pins

ICaptureGraphBuilder2::FindInterface