Arbeiten mit Pinkategorien

Sie können die ICaptureGraphBuilder2::FindPin-Methode verwenden, um nach einem Filter für eine Stecknadel mit einer bestimmten Stecknadelkategorie zu suchen. Im folgenden Beispiel wird nach einem Pin für die Videovorschau gesucht:

int i = 0;
hr = pBuild->FindPin(
    pFilter,               // Pointer to a filter to search.
    PINDIR_OUTPUT,         // Which pin direction?
    &PIN_CATEGORY_PREVIEW, // Which category? (NULL means "any category")
    &MEDIATYPE_Video,      // What media type? (NULL means "any type")
    FALSE,                 // Must be connected?
    i,                     // Get the i'th matching pin (0 = first match)
    &pPin                  // Receives a pointer to the pin.
);

Der erste Parameter ist ein Zeiger auf die IBaseFilter-Schnittstelle des Filters. Die nächsten drei Parameter geben die Richtung, die Pinkategorie und den Medientyp an. Der Wert FALSE im fünften Parameter gibt an, dass der Pin entweder verbunden oder nicht verbunden sein kann. (Die genauen Definitionen dieser Parameter finden Sie in der Dokumentation zur -Methode.) Wenn die Methode einen übereinstimmenden Pin findet, gibt sie einen Zeiger auf die IPin-Schnittstelle im pPin-Parameter zurück.

Obwohl die FindPin-Methode praktisch ist, können Sie auch eigene Hilfsfunktionen schreiben, wenn Sie möchten. Um die Kategorie eines Pins zu bestimmen, rufen Sie die IKsPropertySet::Get-Methode auf, wie im Thema Anheften von Eigenschaftensatz beschrieben.

Der folgende Code zeigt eine Hilfsfunktion, die überprüft, ob eine Stecknadel einer angegebenen Kategorie entspricht:

// Returns TRUE if a pin matches the specified pin category.

BOOL PinMatchesCategory(IPin *pPin, REFGUID Category)
{
    BOOL bFound = FALSE;

    IKsPropertySet *pKs = NULL;
    HRESULT hr = pPin->QueryInterface(IID_PPV_ARGS(&pKs));
    if (SUCCEEDED(hr))
    {
        GUID PinCategory;
        DWORD cbReturned;
        hr = pKs->Get(AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, NULL, 0, 
            &PinCategory, sizeof(GUID), &cbReturned);
        if (SUCCEEDED(hr) && (cbReturned == sizeof(GUID)))
        {
            bFound = (PinCategory == Category);
        }
        pKs->Release();
    }
    return bFound;
}

Das nächste Beispiel ist eine Funktion, die nach einer Stecknadel nach Kategorie sucht, ähnlich der FindPin-Methode:

// Finds the first pin that matches a specified pin category and direction.

HRESULT FindPinByCategory(
    IBaseFilter *pFilter, // Pointer to the filter to search.
    PIN_DIRECTION PinDir, // Direction of the pin.
    REFGUID Category,     // Pin category.
    IPin **ppPin)         // Receives a pointer to the pin.
{
    *ppPin = 0;

    HRESULT hr = S_OK;
    BOOL bFound = FALSE;

    IEnumPins *pEnum = 0;
    IPin *pPin = 0;

    hr = pFilter->EnumPins(&pEnum);
    if (FAILED(hr))
    {
        goto done;
    }

    while (hr = pEnum->Next(1, &pPin, 0), hr == S_OK)
    {
        PIN_DIRECTION ThisPinDir;
        hr = pPin->QueryDirection(&ThisPinDir);
        if (FAILED(hr))
        {
            goto done;
        }
        if ((ThisPinDir == PinDir) && 
            PinMatchesCategory(pPin, Category))
        {
            *ppPin = pPin;
            (*ppPin)->AddRef();   // The caller must release the interface.
            bFound = TRUE;
            break;
        }
        SafeRelease(&pPin);
    }

done:
    SafeRelease(&pPin);
    SafeRelease(&pEnum);
    if (SUCCEEDED(hr) && !bFound)
    {
        hr = E_FAIL;
    }
    return hr;
}

Im folgenden Code wird die vorherige Funktion verwendet, um nach einem Videoportanschluss für einen Filter zu suchen:

IPin *pVP; 
hr = FindPinByCategory(pFilter, PINDIR_OUTPUT, 
    PIN_CATEGORY_VIDEOPORT, &pVP);
if (SUCCEEDED(hr))
{
    // Use pVP ... 
    // Release when you are done.
    pVP->Release();
}

Weitere Informationen zu Eigenschaftensätzen finden Sie in der Dokumentation Windows Driver Kit (WDK).

Erweiterte Erfassungsthemen

Pin-Eigenschaftssatz

DirectShow-Videoerfassungsfilter