다음을 통해 공유


필터 또는 핀에서 인터페이스 찾기

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

DirectShow의 많은 작업의 경우 애플리케이션은 Filter Graph Manager에서 메서드를 호출합니다. 그러나 경우에 따라 애플리케이션은 필터 또는 핀에서 메서드를 직접 호출해야 합니다. 예를 들어 많은 필터는 필터를 구성하는 데 사용되는 특수 인터페이스를 노출합니다.

필터 인터페이스의 경우 필터의 IBaseFilter 인터페이스에 대한 포인터가 이미 있을 수 있습니다. 이 경우 QueryInterface 를 사용하여 다른 인터페이스를 가져옵니다. 그러나 일부 필터는 필터 그래프 관리자에 의해 그래프에 추가될 수 있습니다. 자세한 내용은 Intelligent Connect를 참조하세요. 이 경우 IEnumFilters 인터페이스를 사용하여 그래프의 모든 필터를 반복하고 각 필터를 차례로 쿼리합니다. 다음 함수는 이를 보여 줍니다.

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

핀에서 인터페이스를 찾으려면 IEnumPins 인터페이스를 사용하여 필터의 핀을 반복합니다. 다음 함수는 이 작업을 수행하는 방법을 보여줍니다.

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

다음 함수는 필터 또는 핀의 인터페이스를 검색합니다.

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

여기에 표시된 모든 함수는 처음 성공한 QueryInterface에서 중지됩니다.

필터 열거

핀 열거

ICaptureGraphBuilder2::FindInterface