コード例 #1
0
ファイル: filterUtil.cpp プロジェクト: lincolnfz/suvlo
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;
}
コード例 #2
0
ファイル: BaseFunc.cpp プロジェクト: wumuzi520/ForestProject
//查找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;
}