• 获取Filter的三种途径 分类: DirectX 2014-10-09 17:47 438人阅读 评论(0) 收藏


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

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

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

  • 相关阅读:
    注释
    选择器
    SQL语句中查找字符的位置
    SQL语句中截取字符串Substr
    IDENTITY(函数)
    SQL Server设置主键自增长列
    SQL语句操作ALTER
    表的主键
    南京夜市
    夜班
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706501.html
Copyright © 2020-2023  润新知