使用DirectShow获取过滤器(com设备)

时间:2015-01-14 12:41:26

标签: c# filter com directshow

来自code project我收到了此代码但我不明白

此功能应在其类别之后获取所有过滤器(com设备)并将其填入内部列表

有人可以详细解释我搜索过的每个部分对我来说都是新的 我不明白什么是 ICreateDevEnum UCOMIEnumMoniker UCOMIMoniker 我们如何使用它们获取过滤器

protected void getFilters(Guid category)
        {
            int                 hr;
            object              comObj = null;
            ICreateDevEnum      enumDev = null;
            UCOMIEnumMoniker    enumMon = null;
            UCOMIMoniker[]      mon = new UCOMIMoniker[1];

            try 
            {
                // Get the system device enumerator
                Type srvType = Type.GetTypeFromCLSID( Clsid.SystemDeviceEnum );
                if( srvType == null )
                    throw new NotImplementedException( "System Device Enumerator" );
                comObj = Activator.CreateInstance( srvType );
                enumDev = (ICreateDevEnum) comObj;

                // Create an enumerator to find filters in category
                hr = enumDev.CreateClassEnumerator( ref category, out enumMon, 0 );
                if( hr != 0 )
                    throw new NotSupportedException( "No devices of the category" );

                // Loop through the enumerator
                int f;
                do
                {
                    // Next filter
                    hr = enumMon.Next( 1, mon, out f );
                    if( (hr != 0) || (mon[0] == null) )
                        break;

                    // Add the filter
                    Filter filter = new Filter( mon[0] );
                    InnerList.Add( filter );

                    // Release resources
                    Marshal.ReleaseComObject( mon[0] );
                    mon[0] = null;
                }
                while(true);

                // Sort
                InnerList.Sort();
            }
            finally
            {
                enumDev = null;
                if( mon[0] != null )
                    Marshal.ReleaseComObject( mon[0] ); mon[0] = null;
                if( enumMon != null )
                    Marshal.ReleaseComObject( enumMon ); enumMon = null;
                if( comObj != null )
                    Marshal.ReleaseComObject( comObj ); comObj = null;
            }
        }

1 个答案:

答案 0 :(得分:1)

您在本机API上使用[未记录的]托管包装器,但是API本身在MSDN上有详细记录,并且接口名称具有直接映射。

请参阅Using the System Device Enumerator,其中介绍了相关标识符。

  

要使用系统设备枚举器,请执行以下操作:

     
      
  1. 通过调用CoCreateInstance创建系统设备枚举器。类标识符(CLSID)是CLSID_SystemDeviceEnum。
  2.   
  3. 通过使用所需类别的CLSID调用 ICreateDevEnum :: CreateClassEnumerator来获取类别枚举器。此方法返回IEnumMoniker接口指针。如果类别为空(或不存在),则该方法返回S_FALSE而不是错误代码。如果是这样,返回的IEnumMoniker指针为NULL并且取消引用它将导致异常。 [...]
  4.