视频捕获 之 如何使用系统设备枚举器

原创 2004年04月15日 16:07:00

如何使用系统设备枚举器<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

系统设备枚举器为我们按类型枚举已注册在系统中的Fitler提供了统一的方法。而且它能够区分不同的硬件设备,即便是同一个Filter支持它们。这对那些使用Windows驱动模型和KSProxy Filter的设备来说是非常有用的。系统设备枚举器对它们按不同的设备实例进行对待(译注:虽然它们支持相同Filter)。

当我们利用系统设备枚举器查询设备的时候,系统设备枚举器为特定类型的设备(如,音频捕获和视频压缩)生成了一张枚举表(Enumerator)。类型枚举器(Category enumerator)为每个这种类型的设备返回一个Moniker,类型枚举器自动把每一种即插即用的设备包含在内。

 

按如下的步骤使用系统设备枚举器:

1.    调用方法CoCreateInstance生成系统设备枚举器。类标识(CLSID)为CLSID_SystemDeviceEnum

2.    调用ICreateDevEnum::CreateClassEnumerator方法生成类型枚举器,参数为你想要得到的类型的CLSID,该方法返回一个IEnumMoniker接口指针,如果指定的类型(是空的)或不存在,函数ICreateDevEnum::CreateClassEnumerator将返回S_FALSE而不是错误代码,同时IEnumMoniker指针(译注:通过参数返回)也是空的,这就要求我们在调用CreateClassEnumerator的时候明确用S_OK进行比较而不是使用宏SUCCEEDED

3.    使用IEnumMoniker::Next方法依次得到IEnumMoniker指针中的每个moniker。该方法返回一个IMoniker接口指针。当Next到达枚举的底部,它的返回值仍然是S_FALSE,这里我们仍需要用S_OK来进行检验。

4.    想要得到该设备较为友好的名称(例如想要在用户界面中进行显示),调用IMoniker::BindToStorage方法。

5.    如果想要生成并初始化管理该设备的Filter调用3返回指针的IMonitor::BindToObject方法,接下来调用IFilterGraph::AddFilter把该Filter添加到视图中。

下图说明了上述步骤:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

下面的代码示例了如何枚举用户系统中的视频压缩器,为了简化,只给出了很少的错误检查。

 

 

 

 

设备Moniker

IMoniker::GetDisplayName方法返回moniker的名字。你可以把这个名字传递给IFilterGraph2::AddSourceFilterForMoniker,这样可以生成该设备的捕获Filter

 

 

虽然,用上述方法得到的名字也有较好的可读性,但是我们一般不把它显示给用户,如前面所示,我们一般用从IPropertyBag得到的名字。

方法IMoniker::ParseDisplayNameMkParseDisplayName可以用来生成指定filter类型的设备的moniker。名字以“@device:*:{category-clsid}”,代表了类型的GUID,默认的moniker是设备枚举器中的第一个moniker

 

 

 

【转】如何使用系统设备枚举器

 如何使用系统设备枚举器  系统设备枚举器为我们按类型枚举已注册在系统中的Fitler提供了统一的方法。而且它能够区分不同的硬件设备,即便是同一个Filter支持它们。这对那些使用Windows驱动模...
  • ding_net
  • ding_net
  • 2010年12月24日 11:32
  • 560

如何使用系统设备枚举器

系统设备枚举器为我们按类型枚举已注册在系统中的Fitler提供了统一的方法。而且它能够区分不同的硬件设备,即便是同一个Filter支持它们。这对那些使用Windows驱动模型和KSProxy Filt...
  • mao0514
  • mao0514
  • 2013年11月15日 16:03
  • 1779

C++ 实现Windows系统设备枚举

1.枚举系统设备 HDEVINFO hDevInfo; SP_DEVINFO_DATA DeviceInfoData; DWORD dwDevID; // 得到所有设备 HDEVINFO ...
  • qq_26790617
  • qq_26790617
  • 2016年03月26日 12:41
  • 473

Java 视频捕获(JMF)

class Camera extends Applet implements ControllerListener{ private Vector vector; private Capt...
  • tzwl2006
  • tzwl2006
  • 2007年05月11日 22:07
  • 691

Windows枚举搜索远程蓝牙设备

主要使用微软自带的蓝牙API,注意使用的蓝牙适配器应当使用的是微软自带的蓝牙驱动(可以通过设备和打印机界面添加远程蓝牙设备即表示可以使用windows蓝牙api,此时安装的蓝牙设备会在设备管理器中显示...
  • jirryzhang
  • jirryzhang
  • 2017年04月07日 19:50
  • 1645

C# 入门(14) 枚举器(enumerator)和迭代器(iterator)

C#的枚举器和迭代器
  • l773575310
  • l773575310
  • 2017年05月04日 10:50
  • 344

OC 中快速枚举器简单讲解.

快速枚举器原型: for ( in )  {           } 参数意义:      type * 从集合中获取到的元素类型      object 从获取到的对象起一个临...
  • FIRE_Vayen
  • FIRE_Vayen
  • 2015年02月13日 14:12
  • 713

HashTable四种遍历方式

package coreJava; import java.util.Enumeration; import java.util.Hashtable; import java.util.It...
  • Cjava_math
  • Cjava_math
  • 2017年10月19日 18:01
  • 182

USB之(五)设备枚举

1、枚举是什么?     枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序。调试USB设备,很重要的一点就是USB的枚举过程,只要枚举...
  • ivy_reny
  • ivy_reny
  • 2015年08月17日 15:52
  • 873

系统设备的枚举(DirectShow)

DirectShow 对系统中不可预知性硬件提供了良好的支持,其方法是使用系统枚举,系统枚举的一般过程如下所示: (1)使用CoCreateInstance函数创建系统枚举器组建对象(CLSID...
  • yuanweihuayan
  • yuanweihuayan
  • 2013年12月09日 19:34
  • 1529
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:视频捕获 之 如何使用系统设备枚举器
举报原因:
原因补充:

(最多只允许输入30个字)