科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件DirectShow入门之构建Graph图常用技术

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文主要讲述了Graph图构建过程中常用的技巧。

作者:智慧的鱼 来源:天极开发 2007年10月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
如何获得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;
}
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章