获取Filter的三种途径 收藏

获取Filter的三种途径 收藏

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

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

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭