首页 > 代码库 > 获取Filter的三种途径

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

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

获取Filter的三种途径