博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
获取Filter的三种途径 分类: DirectX ...
阅读量:5124 次
发布时间:2019-06-13

本文共 2573 字,大约阅读时间需要 8 分钟。

一、通过CLSID

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

 

二、通过系统枚举器

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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/mao0504/p/4706501.html

你可能感兴趣的文章
Python IO模型
查看>>
DataGridView的行的字体颜色变化
查看>>
Java再学习——关于ConcurrentHashMap
查看>>
如何处理Win10电脑黑屏后出现代码0xc0000225的错误?
查看>>
局域网内手机访问电脑网站注意几点
查看>>
[Serializable]的应用--注册码的生成,加密和验证
查看>>
Day19内容回顾
查看>>
第七次作业
查看>>
Linux操作系统 和 Windows操作系统 的区别
查看>>
Android-多线程AsyncTask
查看>>
linux中启动与终止lnmp的脚本
查看>>
LeetCode【709. 转换成小写字母】
查看>>
如何在Access2007中使用日期类型查询数据
查看>>
CF992E Nastya and King-Shamans(线段树二分+思维)
查看>>
第一个Java Web程序
查看>>
树状数组_一维
查看>>
如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下:
查看>>
linux install ftp server
查看>>
嵌入式软件设计第8次实验报告
查看>>
算法和数据结构(三)
查看>>