来自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;
}
}
答案 0 :(得分:1)
您在本机API上使用[未记录的]托管包装器,但是API本身在MSDN上有详细记录,并且接口名称具有直接映射。
请参阅Using the System Device Enumerator,其中介绍了相关标识符。
要使用系统设备枚举器,请执行以下操作:
- 通过调用CoCreateInstance创建系统设备枚举器。类标识符(CLSID)是CLSID_SystemDeviceEnum。
- 通过使用所需类别的CLSID调用 ICreateDevEnum :: CreateClassEnumerator来获取类别枚举器。此方法返回IEnumMoniker接口指针。如果类别为空(或不存在),则该方法返回S_FALSE而不是错误代码。如果是这样,返回的IEnumMoniker指针为NULL并且取消引用它将导致异常。 [...]
醇>