获取Filter的三种途径

简介: <p style="font-family: Arial; font-size: 14px; line-height: 26px;">一、通过CLSID</p><p style="font-family: Arial; font-size: 14px; line-height: 26px;"></p><div class="dp-highlighter bg_cpp" style="fon

一、通过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.   
  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

  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,它们不同之处在于:第二种通过确定的种类获得枚举器,第三种通过媒体类型获得枚举器。获得枚举器以后的步骤是相同的。

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

相关文章
|
XML Java 应用服务中间件
Filter 过滤器--基本原理--Filter 过滤器生命周期--过滤器链--注意事项和细节--全部应用实例--综合代码示例
Filter 过滤器--基本原理--Filter 过滤器生命周期--过滤器链--注意事项和细节--全部应用实例--综合代码示例
197 0
|
Java
filter是如何工作的?
Filter是Web.xml中一个常用的配置,可以通过<filter>和<filter-mapping>组合起来使用Filter。
58 0
|
安全 编译器 程序员
C++的转换手段并与explicit关键词配合使用
C++的转换手段并与explicit关键词配合使用
124 2
C++的转换手段并与explicit关键词配合使用
|
分布式计算 Spark
教材P164操作题。编写Spark Steaming程序,使用leftOuterJoin操作及filter方法过滤掉黑名单的数据
教材P164操作题。编写Spark Steaming程序,使用leftOuterJoin操作及filter方法过滤掉黑名单的数据
Web阶段:第十八章:Filter过滤器
Web阶段:第十八章:Filter过滤器
106 0
Web阶段:第十八章:Filter过滤器
|
存储 区块链 索引
web3j教程:以太坊过滤器(filter)筛选和智能合约事件(event)监听
web3j过滤器提供以太坊网络发生的某些事件的通知,对java和安卓程序员来说很有用。在Ethereum以太坊中支持三类过滤器: 块滤波器(Block filters) 未决交易过滤器(Pending transaction filters) 主题过滤器(Topic filters) 块过滤器和未决交易过滤器提供了在网络上创建新交易或块的通知。
8148 0
|
应用服务中间件 数据安全/隐私保护 开发者
Filter 的应用场景、Filter 的目标资源、小结| 学习笔记
快速学习 Filte r的应用场景、Filter 的目标资源、小结。
130 0
|
缓存
【Elastic知识简报】query与filter的区别
1、因此filter的查询是没有评分的,而query的查询是有评分的 2、filter有相应的缓存机制,可以提高查询效率,并且因为filter不计算相关性评分,所以查询速度更快
174 0
|
存储 Java 程序员
|
数据安全/隐私保护
ES ip filter 功能探秘
要开RBAC,不然无效果。
666 0