필터 또는 핀에서 인터페이스 찾기
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media 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에서 중지됩니다.
관련 항목