Condividi tramite


Enumerazione dei pin

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

I filtri supportano il metodo IBaseFilter::EnumPins , che enumera i pin disponibili nel filtro. Restituisce un puntatore all'interfaccia IEnumPins . Il metodo IEnumPins::Next recupera i puntatori all'interfaccia IPin .

Nell'esempio seguente viene illustrata una funzione che individua un pin con una determinata direzione (input o output) in un determinato filtro. Usa l'enumerazione PIN_DIRECTION per specificare la direzione del pin e il metodo IPin::QueryDirection per trovare la direzione di ogni pin enumerato. Se questa funzione trova un pin corrispondente, restituisce un puntatore all'interfaccia IPin con un conteggio dei riferimenti in sospeso. Il chiamante è responsabile del rilascio dell'interfaccia.

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

Questa funzione può essere facilmente modificata per restituire l'n° pin con la direzione specificata o l'npin non connesso. Per verificare se un pin è connesso a un altro pin, chiamare il metodo IPin::ConnectedTo .

Enumerazione di oggetti in un grafico di filtro

Trovare un pin non connesso in un filtro

Tecniche di Graph-Building generali

Imposta proprietà Pin