一、通过CLSID

  1. IBaseFilter *pF = 0;
  2. HRESULT hr = CoCreateInstance(clsid, 0, CLSCTX_INPROC_SERVER,
  3. IID_IBaseFilter, reinterpret_cast<void**>(&pF));

二、通过系统枚举器

  1. ICreateDevEnum *pSysDevEnum = NULL;
  2. hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
  3. IID_ICreateDevEnum, (void **)&pSysDevEnum);
  4. if (FAILED(hr))
  5. {
  6. return hr;
  7. }
  8. IEnumMoniker *pEnumCat = NULL;
  9. hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoCompressorCategory, &pEnumCat, 0);
  10. if (hr == S_OK)
  11. {
  12. IMoniker *pMoniker = NULL;
  13. ULONG cFetched;
  14. while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)
  15. {
  16. IPropertyBag *pPropBag;
  17. hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
  18. (void **)&pPropBag);
  19. if (SUCCEEDED(hr))
  20. {
  21. VARIANT varName;
  22. VariantInit(&varName);
  23. hr = pPropBag->Read(L"FriendlyName", &varName, 0);
  24. IBaseFilter *pFilter;
  25. hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter,
  26. (void**)&pFilter);
  27. pPropBag->Release();
  28. }
  29. pMoniker->Release();
  30. }
  31. pEnumCat->Release();
  32. }
  33. pSysDevEnum->Release();

三、通过Filter Mapper

  1. IFilterMapper2 *pMapper = NULL;
  2. IEnumMoniker *pEnum = NULL;
  3. hr = CoCreateInstance(CLSID_FilterMapper2,
  4. NULL, CLSCTX_INPROC, IID_IFilterMapper2,
  5. (void **) &pMapper);
  6. GUID arrayInTypes[2];
  7. arrayInTypes[0] = MEDIATYPE_Video;
  8. arrayInTypes[1] = MEDIASUBTYPE_dvsd;
  9. hr = pMapper->EnumMatchingFilters(
  10. &pEnum,
  11. 0,                  // Reserved.
  12. TRUE,               // Use exact match?
  13. MERIT_DO_NOT_USE+1, // Minimum merit.
  14. TRUE,               // At least one input pin?
  15. 1,                  // Number of major type/subtype pairs for input.
  16. arrayInTypes,       // Array of major type/subtype pairs for input.
  17. NULL,               // Input medium.
  18. NULL,               // Input pin category.
  19. FALSE,              // Must be a renderer?
  20. TRUE,               // At least one output pin?
  21. 0,                  // Number of major type/subtype pairs for output.
  22. NULL,               // Array of major type/subtype pairs for output.
  23. NULL,               // Output medium.
  24. NULL);              // Output pin category.
  25. IMoniker *pMoniker;
  26. ULONG cFetched;
  27. while (pEnum->Next(1, &pMoniker, &cFetched) == S_OK)
  28. {
  29. IPropertyBag *pPropBag = NULL;
  30. hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
  31. (void **)&pPropBag);
  32. if (SUCCEEDED(hr))
  33. {
  34. VARIANT varName;
  35. VariantInit(&varName);
  36. hr = pPropBag->Read(L"FriendlyName", &varName, 0);
  37. VariantClear(&varName);
  38. IBaseFilter *pFilter;
  39. hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pFilter);
  40. pPropBag->Release();
  41. }
  42. pMoniker->Release();
  43. }
  44. pMapper->Release();
  45. pEnum->Release();

第一种方法是最直接的,也最简单,不过当不清楚CLSID的时候,就不得不用后面两种方法。

第二种方法和第三中方法都是使用枚举器枚举Filter,通过匹配Filter的属性来得到Filter,它们不同之处在于:第二种通过确定的种类获得枚举器,第三种通过媒体类型获得枚举器。获得枚举器以后的步骤是相同的。

这三种方法最常用的是第二种。

获取Filter的三种途径的更多相关文章

  1. iOS用三种途径实现一方法有多个返回值

    以前觉得这种标题有点偏向于理论,实际开发中怎么会有这种诡异的需求,但是真正遇到了这种硬需求时觉得还是有那么点价值的,理论付诸了实践在此也就做了个整理. 以我私下开发中的一处代码为例,本意是希望有这么一 ...

  2. C#生成XML的三种途径

    C#生成XML的三种途径 为了全面,这里都将XML保存到文件中,有三种生成XML的方式: 1.我认为是最原始,最基本的一种:利用XmlDocument向一个XML文件里写节点,然后再利用XmlDocu ...

  3. 获取Type的三种方式

    using System;using UnityEngine; public class Type_Test : MonoBehaviour{    private void Awake()    { ...

  4. 【深入Struts2】获取ServletAPI的三种方式

    一:获取servletAPI的三种方法 在传统的Web开发中,经常会用到Servlet API中的HttpServletRequest.HttpSession和ServletContext.Strut ...

  5. java 获取时间戳的三种方式

      java 获取时间戳的三种方式 CreationTime--2018年7月13日16点29分 Author:Marydon 1.实现方式 方式一:推荐使用 System.currentTimeMi ...

  6. 【Struts2】Struts2获取session的三种方式

    1.Map<String,Object> map =  ActionContext.getContext().getSession(); 2.HttpSession session = S ...

  7. js获取时间戳的三种方式

      js获取时间戳的三种方式 CreateTime--2018年5月23日08:44:10 Author:Marydon // 方式一:推荐使用 var timestamp=new Date().ge ...

  8. Struts2(四.注册时检查用户名是否存在及Action获取数据的三种方式)

    一.功能 1.用户注册页面 <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  9. 虚拟化x86的三种途径

    虚拟化x86的三种途径 作者:缪天翔链接:https://www.zhihu.com/question/20145026/answer/34527331 x86上的全系统虚拟化有三种主要的途径: 二进 ...

随机推荐

  1. Android Studio 3.1 Beta 1发布,如何及时下载更新

    每次收到Android Studio更新提示,总是延迟一段时间才能下载的到或者更新成功.架梯子也不行.而且更新检测也是时断时续.Android Studio 3.0.1使用一段时间,多开几个工程.经常 ...

  2. web.xml组件加载顺序

    在配置项目组件的过程中, 了解Tomcat加载组件顺序很有必要. 例如某些框架如Quartz的集群功能需要数据库的支持, 数据库的加载肯定要在框架组件加载之前. 经过查阅和Debug发现, web.x ...

  3. BZOJ 2724: [Violet 6]蒲公英 [分块 区间众数]

    传送门 题面太美不忍不放 分块分块 这种题的一个特点是只有查询,通常需要预处理:加入修改的话需要暴力重构预处理 预处理$f[i][j]$为第i块到第j块的众数,显然$f[i][j]=max{f[i][ ...

  4. 统计细菌基因组ORF

    提取细菌基因组ORF思路: 1.通过FNA文件得到细菌基因组序列 2.分正负链和三个相位共6种情况统计ORF 3.写入文件 转载请保留出处! 统计细菌基因组ORF 贴上Python代码(版本:3.6) ...

  5. 关于node的基础理论,书上看来的

    最近看了一本书,说了一些Node.js的东西,现在来记录一下,让自己记得更牢靠一点. 在书上,是这样介绍的:Node.js模型是源于Ruby的Event Machine 和 Python的Twiste ...

  6. sql的升阶

    前言:基本数据库操作根本无法满足实际的需要,需要引入更多的操作. 触发器-隐式的,主动的,更新数据表中的信息.带有inserted和deleted两个临时表,代表新操作和旧操作. 它是一种特殊的存储过 ...

  7. hibernate连接MySQL配置hibernate.cfg.xml

    今天刚学完hibernate所以急着做一个hibernate的项目,有不足的请帮我改正一下.谢谢大家 <hibernate-configuration> <session-facto ...

  8. Action里面的自带的字段的含义

  9. MysqL应该考虑到的安全策略

    1:使用预处理语句防止SQL注入2:写入数据库的数据要进行特殊字符的转义,比如字符中带单引号和双引号需要在应用层转义,这样为了防止SQL注入3:查询的错误信息不要返回给用户,将错误记录到日志.错误信息 ...

  10. PHP的性能优化方法总结

    什么情况之下,会遇到PHP性能问题? 1:PHP语法使用不恰当. 2:使用PHP语言做了它不擅长的事情. 3:使用PHP语言连接的服务不给力. 4:PHP自身的短板(PHP自身做不了的事情). 5:我 ...