繁体   English   中英

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

[英]get filters(com devices) using DirectShow

代码项目中我得到了这个代码,但我听不懂

此函数应获取其类别之后的所有过滤器(com设备)并将其填充到内部列表中

有人可以详细解释我搜索过的每个部分的所有内容对我来说似乎是新的,我不明白什么是ICreateDevEnumUCOMIEnumMonikerUCOMIMoniker以及我们如何使用它们来获取过滤器

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;
            }
        }

您正在通过本机API使用[未公开说明]托管包装器,但是该API本身在MSDN上有详细说明,并且接口名称具有直接映射。

请参阅使用系统设备枚举器 ,其中描述了有问题的标识符。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM