Udostępnij przez


Wyliczanie pinów

[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEngineoraz Audio/Video Capture z Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Microsoft zdecydowanie zaleca, aby przy tworzeniu nowego kodu używać MediaPlayer, IMFMediaEngine oraz Audio/Video Capture w Media Foundation, zamiast DirectShow, jeżeli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

Filtry obsługują metodę IBaseFilter::EnumPins, która wylicza numery PIN dostępne w filtrze. Zwraca wskaźnik do interfejsu IEnumPins. Metoda IEnumPins::Next pobiera wskaźniki interfejsu IPin.

W poniższym przykładzie pokazano funkcję, która znajduje pin z danym kierunkiem (wejściem lub wyjściem) na danym filtrze. Używa wyliczenia PIN_DIRECTION do określenia kierunku pinu oraz metody IPin::QueryDirection, aby znaleźć kierunek każdego wyliczonego pinu. Jeśli ta funkcja znajdzie pasujący numer PIN, zwraca wskaźnik interfejsu IPin z zaległą liczbą odwołań. Obiekt wywołujący jest odpowiedzialny za wydanie interfejsu.

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;  
}

Tę funkcję można łatwo zmodyfikować, aby zwrócić n-ty pin z określonym kierunkiem lub n-ty niepodłączony pin. (Aby dowiedzieć się, czy numer PIN jest połączony z innym numerem PIN, wywołaj metodę IPin::ConnectedTo).

wyliczanie obiektów w wykresie filtru

znajdź niepodłączony pin na filtrze

Ogólne techniki Graph-Building

Zestaw właściwości Pin