扩展单元插件体系结构
USB 视频类驱动程序将扩展单元公开为 USB 视频 KS 代理筛选器中的节点。 扩展单元控件在用户模式下作为在节点上设置的属性进一步公开,该属性的类型KSNODETYPE_DEV_SPECIFIC。 属性集的 GUID 与扩展单元描述符的 GUID 匹配。
各个扩展单元控件的编号应从 1 持续到某个最大值 n。 这些控件直接映射到扩展单元属性集上 (ID) 的属性标识符,并且可以通过 IKsControl 使用标准 KSPROPERTY 请求访问它们。
为了响应来自应用程序的属性请求,UVC 驱动程序返回具有将 KSPROPERTY_MEMBERSHEADER 结构的 MembersFlags 成员专门设置为KSPROPERTY_MEMBER_RANGES的属性值。 UVC 不支持任意长度的阶梯范围或扩展单元默认值。
若要向应用程序公开扩展单元属性,可以编写公开 COM API 的用户模式插件 DLL。 可以通过使用 IKsControl 接口向 KS 属性集发出请求来实现此 API。 Vidcap.ax 根据某些注册表项自动加载节点接口插件。 应用程序可以使用 IKsTopologyInfo::CreateNodeInstance 访问接口,然后调用 node 对象上的 QueryInterface 以获取所需的 COM API。
编写和使用扩展单元插件需要以下元素:
实现扩展单元 API 和名为 IKsNodeControl 的接口的标头和 cpp 文件。 Vidcap.ax 使用 IKsNodeControl 接口通知插件扩展节点标识符,并为其提供 IKsControl 的实例。 可以在 示例扩展单元插件 DLL 中找到这些文件的示例代码。
一个 .rgs 文件,用于在 HKLM\System\CCS\Control\NodeInterfaces\Property_Set_GUID 注册表子项下注册节点接口和类 ID ( CLSIDs) 。 此注册表子项中的条目包含接口 ID (IID) 和 CLSID 的二进制值。 有关详细信息,请参阅 UVC 扩展单元的示例注册表项。
调用此接口的应用程序。 应用程序首先使用 IKsTopologyInfo::CreateNodeInstance 创建具有正确节点 ID 的节点实例。 然后,应用程序在节点实例上调用 QueryInterface 以获取所需的扩展单元接口。 有关详细信息,请参阅 UVC 扩展单元的示例应用程序 和支持 具有扩展单元的 Autoupdate 事件
本部分中的代码示例演示了所有这些元素。 请参阅 生成扩展单元示例控件 ,了解如何生成示例插件和关联的示例应用程序代码。
注册插件 DLL 并提供上述注册表项后,Vidcap.ax 在创建节点实例时自动加载相关的节点接口。
注意 从 Windows XP SP2 开始,扩展单元属性集仅在节点上受支持,在筛选器上不受支持。
注册表注意事项
若要注册插件导出的接口的 IID 和 CLSID,可以使用 DLL 注册或特定于设备的安装信息 (INF) 文件。
有关显示注册表项所需值的示例 .rgs 文件,请参阅 UVC 扩展单元的示例注册表项。 本主题还演示如何编写特定于设备的 INF 文件来安装 USB 视频设备和注册插件 DLL。 可以根据特定需求选择 DLL 注册或特定于设备的 INF 文件。
原理图
以下示意图显示了编写和使用扩展单元插件所涉及的各种模块之间的关系。 具体而言,它会跟踪从应用程序到插件 DLL 的连接,下到驱动程序,最后跟踪到设备本身的扩展单元的连接。 示意图还说明了所涉及的各种 GUID:使用匹配的颜色突出显示相同的值。
事件机制
USB 视频类支持自动更新事件,其中设备会通知主机驱动程序其任何控件的更改。 Microsoft USB 视频类驱动程序通过允许应用程序注册自动更新事件来支持此概念。 获取更新的过程涉及三个步骤:
使用 KSEVENTSETID_VIDCAPNotify::KSEVENT_VIDCAP_AUTO_UPDATE 注册更新事件
侦听通知事件句柄上的事件
完成后取消通知