AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

DirectShow入门之构建Graph图常用技术

51自学网 2015-08-30 http://www.wanshiok.com

 

  如何获得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;
}

 

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:利用Visual C++制作应用程序启动画面  下一篇:DirectSound学习指南之枚举声音设备