Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1084492
  • 博文数量: 282
  • 博客积分: 10865
  • 博客等级: 上将
  • 技术积分: 2480
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-12 12:35
文章存档

2017年(1)

2016年(3)

2015年(10)

2014年(12)

2013年(5)

2012年(10)

2011年(29)

2010年(3)

2008年(13)

2007年(92)

2006年(104)

我的朋友

分类:

2007-09-20 23:09:52

如何获得filter或者pin的接口指针

  一般来说,我们都是通过Filter图表管理器来进行一些操作,但是,有时候,我们也直接调用filter或者pin的一些方法,因此,我们需要获取filter或pin的接口指针。

  对于filter的接口指针,可以通过IEnumFilters来枚举filter的指针,看下面的代码:

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来获得pin的接口指针,其实就是枚举。

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

  下面的代码演示了如何搜索任意的filter和pin的接口:

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. //调用的是上面的搜索pin的函数
   hr = FindPinInterface(pF, iid, ppUnk);
  }
  pF->Release();
  if (SUCCEEDED(hr))
  {
   break;
  }
 }
 pEnum->Release();
 return hr;
}
阅读(1275) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~