Aufzählen von Pins

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

Filter unterstützen die IBaseFilter::EnumPins-Methode , die die für den Filter verfügbaren Pins auflistet. Sie gibt einen Zeiger auf die IEnumPins-Schnittstelle zurück. Die IEnumPins::Next-Methode ruft IPin-Schnittstellenzeiger ab.

Das folgende Beispiel zeigt eine Funktion, die eine Pin mit einer bestimmten Richtung (Eingabe oder Ausgabe) für einen bestimmten Filter sucht. Es verwendet die PIN_DIRECTION-Enumeration , um die Pinrichtung anzugeben, und die IPin::QueryDirection-Methode , um die Richtung der einzelnen aufgezählten Pins zu ermitteln. Wenn diese Funktion einen übereinstimmenden Pin findet, gibt sie einen IPin-Schnittstellenzeiger mit einer ausstehenden Verweisanzahl zurück. Der Aufrufer ist für die Freigabe der Schnittstelle verantwortlich.

HRESULT GetPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir, IPin **ppPin)
{
    IEnumPins  *pEnum = NULL;
    IPin       *pPin = NULL;
    HRESULT    hr;

    if (ppPin == NULL)
    {
        return E_POINTER;
    }

    hr = pFilter->EnumPins(&pEnum);
    if (FAILED(hr))
    {
        return hr;
    }
    while(pEnum->Next(1, &pPin, 0) == S_OK)
    {
        PIN_DIRECTION PinDirThis;
        hr = pPin->QueryDirection(&PinDirThis);
        if (FAILED(hr))
        {
            pPin->Release();
            pEnum->Release();
            return hr;
        }
        if (PinDir == PinDirThis)
        {
            // Found a match. Return the IPin pointer to the caller.
            *ppPin = pPin;
            pEnum->Release();
            return S_OK;
        }
        // Release the pin for the next time through the loop.
        pPin->Release();
    }
    // No more pins. We did not find a match.
    pEnum->Release();
    return E_FAIL;  
}

Diese Funktion kann leicht geändert werden, um den n-ten Pin mit der angegebenen Richtung oder den nichtverbundenen Pin zurückzugeben. (Um herauszufinden, ob eine Pin mit einer anderen Pin verbunden ist, rufen Sie die IPin::ConnectedTo-Methode auf.)

Auflisten von Objekten in einem Filtergraphen

Suchen einer nicht verbundenen Pin in einem Filter

Allgemeine Graph-Building Techniken

Pin-Eigenschaftssatz