zoukankan      html  css  js  c++  java
  • 获取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,它们不同之处在于:另外一种通过确定的种类获得枚举器,第三种通过媒体类型获得枚举器。

    获得枚举器以后的步骤是同样的。

    这三种方法最经常使用的是另外一种。

  • 相关阅读:
    Java一次读取文本文件所有内容
    java Socket多线程聊天程序
    输出1-100内的质数(素数)
    random.nextInt()与Math.random()基础用法
    【bash】今天你坑队友了吗
    【awk】按小时切割日志
    python获取aliyun ECS实例
    记一次优化ansible inventory的小例子
    Apache Flume入门指南[翻译自官方文档]
    django入门-自定义管理界面-part7
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7107245.html
Copyright © 2011-2022 走看看