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; }
//查找FilterGraph上某一个接口,不管在Filter还是Pin上,找到即返回 BOOL FindInterface(IGraphBuilder* pGraphBuilder, REFGUID iid, void** ppUnk) { if(!pGraphBuilder || !ppUnk) return FALSE; HRESULT hr = E_FAIL; IEnumFilters* pEnumFilter = NULL; if(FAILED(pGraphBuilder->QueryInterface(&pEnumFilter))) return FALSE; BOOL bRet = FALSE; IBaseFilter* pFilter = NULL; while(S_OK == pEnumFilter->Next(1,&pFilter,NULL)) { hr = pFilter->QueryInterface(iid,ppUnk); if(SUCCEEDED(hr)) { bRet = TRUE; pFilter->Release(); break; } else { bRet = FindPinInterface(pFilter,iid,ppUnk); if(bRet) { pFilter->Release(); break; } } pFilter->Release(); } pEnumFilter->Release(); return FALSE; }