获取Filter的三种途径
一、通过CLSID
- IBaseFilter *pF = 0;
- HRESULT hr = CoCreateInstance(clsid, 0, CLSCTX_INPROC_SERVER,
- IID_IBaseFilter, reinterpret_cast<void**>(&pF));
二、通过系统枚举器
- ICreateDevEnum *pSysDevEnum = NULL;
- hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
- IID_ICreateDevEnum, (void **)&pSysDevEnum);
- if (FAILED(hr))
- {
- return hr;
- }
- IEnumMoniker *pEnumCat = NULL;
- hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoCompressorCategory, &pEnumCat, 0);
- if (hr == S_OK)
- {
- IMoniker *pMoniker = NULL;
- ULONG cFetched;
- while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)
- {
- IPropertyBag *pPropBag;
- hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
- (void **)&pPropBag);
- if (SUCCEEDED(hr))
- {
- VARIANT varName;
- VariantInit(&varName);
- hr = pPropBag->Read(L"FriendlyName", &varName, 0);
- IBaseFilter *pFilter;
- hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter,
- (void**)&pFilter);
- pPropBag->Release();
- }
- pMoniker->Release();
- }
- pEnumCat->Release();
- }
- pSysDevEnum->Release();
三、通过Filter Mapper
- IFilterMapper2 *pMapper = NULL;
- IEnumMoniker *pEnum = NULL;
- hr = CoCreateInstance(CLSID_FilterMapper2,
- NULL, CLSCTX_INPROC, IID_IFilterMapper2,
- (void **) &pMapper);
- GUID arrayInTypes[2];
- arrayInTypes[0] = MEDIATYPE_Video;
- arrayInTypes[1] = MEDIASUBTYPE_dvsd;
- hr = pMapper->EnumMatchingFilters(
- &pEnum,
- 0, // Reserved.
- TRUE, // Use exact match?
- MERIT_DO_NOT_USE+1, // Minimum merit.
- TRUE, // At least one input pin?
- 1, // Number of major type/subtype pairs for input.
- arrayInTypes, // Array of major type/subtype pairs for input.
- NULL, // Input medium.
- NULL, // Input pin category.
- FALSE, // Must be a renderer?
- TRUE, // At least one output pin?
- 0, // Number of major type/subtype pairs for output.
- NULL, // Array of major type/subtype pairs for output.
- NULL, // Output medium.
- NULL); // Output pin category.
- IMoniker *pMoniker;
- ULONG cFetched;
- while (pEnum->Next(1, &pMoniker, &cFetched) == S_OK)
- {
- IPropertyBag *pPropBag = NULL;
- hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
- (void **)&pPropBag);
- if (SUCCEEDED(hr))
- {
- VARIANT varName;
- VariantInit(&varName);
- hr = pPropBag->Read(L"FriendlyName", &varName, 0);
- VariantClear(&varName);
- IBaseFilter *pFilter;
- hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter, (void**)&pFilter);
- pPropBag->Release();
- }
- pMoniker->Release();
- }
- pMapper->Release();
- pEnum->Release();
第一种方法是最直接的,也最简单,不过当不清楚CLSID的时候,就不得不用后面两种方法。
第二种方法和第三中方法都是使用枚举器枚举Filter,通过匹配Filter的属性来得到Filter,它们不同之处在于:第二种通过确定的种类获得枚举器,第三种通过媒体类型获得枚举器。获得枚举器以后的步骤是相同的。
这三种方法最常用的是第二种。
获取Filter的三种途径的更多相关文章
- iOS用三种途径实现一方法有多个返回值
以前觉得这种标题有点偏向于理论,实际开发中怎么会有这种诡异的需求,但是真正遇到了这种硬需求时觉得还是有那么点价值的,理论付诸了实践在此也就做了个整理. 以我私下开发中的一处代码为例,本意是希望有这么一 ...
- C#生成XML的三种途径
C#生成XML的三种途径 为了全面,这里都将XML保存到文件中,有三种生成XML的方式: 1.我认为是最原始,最基本的一种:利用XmlDocument向一个XML文件里写节点,然后再利用XmlDocu ...
- 获取Type的三种方式
using System;using UnityEngine; public class Type_Test : MonoBehaviour{ private void Awake() { ...
- 【深入Struts2】获取ServletAPI的三种方式
一:获取servletAPI的三种方法 在传统的Web开发中,经常会用到Servlet API中的HttpServletRequest.HttpSession和ServletContext.Strut ...
- java 获取时间戳的三种方式
java 获取时间戳的三种方式 CreationTime--2018年7月13日16点29分 Author:Marydon 1.实现方式 方式一:推荐使用 System.currentTimeMi ...
- 【Struts2】Struts2获取session的三种方式
1.Map<String,Object> map = ActionContext.getContext().getSession(); 2.HttpSession session = S ...
- js获取时间戳的三种方式
js获取时间戳的三种方式 CreateTime--2018年5月23日08:44:10 Author:Marydon // 方式一:推荐使用 var timestamp=new Date().ge ...
- Struts2(四.注册时检查用户名是否存在及Action获取数据的三种方式)
一.功能 1.用户注册页面 <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- 虚拟化x86的三种途径
虚拟化x86的三种途径 作者:缪天翔链接:https://www.zhihu.com/question/20145026/answer/34527331 x86上的全系统虚拟化有三种主要的途径: 二进 ...
随机推荐
- 2017年总结的前端文章——一劳永逸的搞定 flex 布局
flex 基本概念 使用 flex 布局首先要设置父容器 display: flex,然后再设置 justify-content: center 实现水平居中,最后设置 align-items: ce ...
- ABP 多租户 对应多数据库 租户启动报错
什么是多租户? “软件多租户是指一个软件体系结构,其中一个软件实例在一个服务器上运行,并为多个租户提供服务*租户是一组共享具有软件实例特定权限的公共访问权限的用户. 架构中,软件应用程序旨在为每个租户 ...
- ehcache memcache redis 三大缓存男高音[转]
原文链接:http://blog.csdn.net/jationxiaozi/article/details/8509732 最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特 ...
- POJ 2185 Milking Grid [KMP]
Milking Grid Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 8226 Accepted: 3549 Desc ...
- React ref回调函数例子
ref属性也可以是一个回调函数而不是一个名字. 这个函数将要在组件被挂载之后立即执行. 这个参照的组件将会作为该函数的参数,这个函数可以立即使用这个组件参数,当然也可以将其保存供以后使用. 当这个 ...
- C#查询XML解决“需要命名空间管理器”问题
在查询xml时有时会遇到带有前缀的xml,例如:"<ows:Keyword></ows:Keyword>" 这时像往常一样查询就会报错,类似于"需 ...
- 深度学习(一。深度学习概览)(mooc视频https://www.icourse163.org/learn/MSRA-1002255002?tid=1002370003#/learn/content?type=detail&id=1003271123)
一. 深度学习概览 1.为什么resnet应用在图像识别 因为传统神经网络精度有限,而只是增加层数无法提高精度.而resnet可以改变这个问题. 2.Microsoft SwitchBoard 在语音 ...
- linux服务器ssh、公匙和密钥实战详解
一..我们先建好一上haiwen用户用来,做为密码钥和SSH对像 二.修改vi /etc/ssh/sshd_config 文件,禁用ROOT远程直接登录. 三.ssh的公钥认证配置,只能用密匙才能登录 ...
- linux 中 svn 服务器搭建 重启
鉴于在搭建时,参考网上很多资料,网上资料在有用的同时,也坑了很多人 本文的目的,也就是想让后继之人在搭建svn服务器时不再犯错,不再被网上漫天的坑爹作品所坑害,故此总结 /******开始****** ...
- 拥抱.NET Core系列:MemoryCache 初识
Cache是一个绝大多数项目会用到的一个技术,说起到缓存可能就联想到 Set.Add.Get.Remove.Clear 这几个方法.那么在.NET Core中微软给我们带来了什么样的缓存体验呢?今天我 ...