获取Filter的三种途径

一、通过CLSID

[cpp] view plaincopyprint?

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

 

二、通过系统枚举器

[cpp] view plaincopyprint?

  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.   
  9. IEnumMoniker *pEnumCat = NULL;  
  10. hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoCompressorCategory, &pEnumCat, 0);  
  11.   
  12. if (hr == S_OK)   
  13. {  
  14.     IMoniker *pMoniker = NULL;  
  15.     ULONG cFetched;  
  16.     while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)  
  17.     {  
  18.         IPropertyBag *pPropBag;  
  19.         hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,   
  20.             (void **)&pPropBag);  
  21.         if (SUCCEEDED(hr))  
  22.         {  
  23.             VARIANT varName;  
  24.             VariantInit(&varName);  
  25.             hr = pPropBag->Read(L"FriendlyName", &varName, 0);  
  26.   
  27.             IBaseFilter *pFilter;  
  28.             hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter,  
  29.                 (void**)&pFilter);  
  30.   
  31.             pPropBag->Release();  
  32.         }  
  33.         pMoniker->Release();  
  34.     }  
  35.     pEnumCat->Release();  
  36. }  
  37. pSysDevEnum->Release();  

 

三、通过Filter Mapper

[cpp] view plaincopyprint?

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

 

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

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

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

时间: 2024-09-19 08:55:09

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

物联网改变人们开展业务方式的三种途径

最近几年,物联网一直在蓬勃发展,如今也变得更加现实.更有意义,而不再是此前只在业界流传的空洞时髦术语. 很难想像会出现这样的一个世界:在这样的世界里,用户的牙刷会告诉用户在刷牙时没有刷到哪一颗牙齿,或者用户的冰箱会在用户出现在超市时告诉用户需要购买哪些食品. 事实上,曾经在人们想像中的这些可能性如今都以各种不同形式的应用和技术而存在.将来,或许了很难想像,如果没有这些应用和技术,那又会是一个什么样的世界.所有的这一切,就是物联网--曾经优良的物体如今装备上传感器和网络连接功能,并将数据传送给这个

三种途径助物联网改变业务 省心省时省成本

最近几年,物联网一直在蓬勃发展,如今也变得更加现实.更有意义,而不再是此前只在业界流传的空洞时髦术语. 很难想像会出现这样的一个世界:在这样的世界里,用户的牙刷会告诉用户在刷牙时没有刷到哪一颗牙齿,或者用户的冰箱会在用户出现在超市时告诉用户需要购买哪些食品. 事实上,曾经在人们想像中的这些可能性如今都以各种不同形式的应用和技术而存在.将来,或许了很难想像,如果没有这些应用和技术,那又会是一个什么样的世界.所有的这一切,就是物联网--曾经优良的物体如今装备上传感器和网络连接功能,并将数据传送给这个

拨云见日,企业部署云计算三种途径

云计算作为目前最热门的发展领域,受到了产业链所有环节的重视.随着越来越多的企业利用私有云显著提高了数据中心的资源利用率,企业决策者对于该项技术的理解和认可程度已经明显改善.有数据显示计划部署私有云的企业数量已经从之前的28%增长至当前的33%. 促使企业需要云计算的根本原因是传统的IT方法不管用了.面对竞争激烈的市场,现有的应用程序和服务器孤岛模式无法满足企业千变万化的需求.如今,IT成本昂贵.响应迟缓.资金投入巨大,但最终获得的资源却没有得到充分利用.大多数服务器的利用率只有20%,甚至更低.

对注册表进行编辑的三种途径_注册表

了解了关于注册表的基本内容之后,我们就可以正式进入我们所要讨论的话题了:对注册表进行编辑修改!一般来说,要想对注册表进行增.删.改,可以有以下三种途径: 第一种途径:直接修改(最不安全,但最直接最有效) 就是通过注册表编辑器直接的来修改注册表的键值数据项,这样做会避免在注册表中留下垃圾(虽然都很小,但越来越多会拖慢系统速度),但是要求用户有一定的注册表知识,熟悉注册表内部结构而且一定要小心谨慎. 注册表编辑器是一个可以让你改变系统注册设定的高级工具WIN98注册表编辑器的常用操作注册表编辑器是一

第三种途径---基于XML的ASP留言板

坦白地说,对于ASP我一直都不怎么感兴趣.如果要我写这种服务器端程序的话,我会选择JSP.所以,本人一直都想在网上弄个便宜点的JSP空间:可是正如miles前辈所说,连贵一点的都没有,更不用说便宜的了.没办法,只好用ASP了,对于用ASP写留言板的主要途径,只要是地球人就都知道,用得最多的无外乎就是文件组件与数据库组件:而大多提供ASP的服务商基于安全都禁用了文件组件,也有的禁用了数据库组件.当然,就算用不了这两个组件,也并不代表我们就不能用脚本来创建文件和修改文件了,我们还有第三种途径:MSX

亲身体验解决博客赚钱困难的三种途径

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 亲身体验解决博客赚钱困难的三种途径,今天呢,笔者就分享一下亲身可以赚到钱的几种途径,也为广大博客爱好者提供一个好的方式,多的不敢说,至少能够让你赚回空间域名费吧.越来越多的人进入博客市场,特别是那些刚刚进入站长界的朋友,一般都是从博客开始,写一点文章,然后等待收录,等等之类的,可是一般博客不出名的话,都是无法产生大量的收入呢,今天呢,重点就说

AJAX从服务端获取数据的三种方法

本文为原创,如需转载,请注明作者和出处,谢谢!     在本文中将给出一个例子来介绍使用AJAX技术从服务端获得数据的三种方法.这个例子很简单,就是两个选择框(html中的<select>标签),通过选中第一个select的某一项后,会从服务端得到一些数据,并加载到第2个select中. 方法一.从服务端获得XML格式的数据 从服务端获得数据的最容易想到的方法就是在服务端反加一定格式的数据,一般是XML格式,然后在服务端使用XMLDocument或其他技术来读取这些数据,并生成<sele

SEO中获取高质量外链的三种途径

网站seo归根结底离不开链接,不管是内链还是外链都很重要,特别对于百度而言,高质量的外链对关键词排名起到的作用是不可小觑的.但是在大家每天谈的外链获取渠道我都没有采用,比如论坛.博客这些起不到多大作用的.就我在做SEO的过程中,也是我经常使用的获取外链的方法总结如下,希望对不知道如何获取高质量外链的朋友有所帮助. 一.到权重高的网站发布软文 我每次写seo的文章,都会提到这个,软文在seo中的作用非常大,关键是要有很强的执行力,每天坚持写一篇软文我想应该都是没有问题的吧,只要不太懒的话.我这里所

在Linux中连接和使用云存储的三种途径

 个人云存储现在变得非常有用,因为你再也不用担心你把东西存储在什么地方了:你能很容易的获取你的文件,并时刻保持文件更新.在Linux上你也多种保持访问你的云存储.这一点非常棒,因为你可以使用你最喜欢的方式,哪怕你是个终端控. 使用官方客户端 使用这种方式的明显好处就是你可以通过使用他们各自的官方应用访问你的各种云存储.目前,提供官方Linux客户端的服务提供商有SpiderOak, Dropbox, Ubuntu One,Copy.Ubuntu One虽不出名但的确是一个不错的云存储竞争着.Co