【问题标题】:UVC Extension Unit CoCreateInstance FailedUVC 扩展单元 CoCreateInstance 失败
【发布时间】:2013-12-04 01:47:23
【问题描述】:

我正在尝试为符合 UVC 的 USB 相机编写一个 UVC 扩展单元驱动程序。

我从哪里开始?

我基于以下链接中提供的 MSDN 示例开始了开发。 http://msdn.microsoft.com/en-us/library/ff556621%28v=vs.85%29.aspx

替换了过程中指定的所有 GUID。我正在使用 Logitech Pro 9000 USB 摄像头。使用 UVCView 工具获得 UVC 扩展 guid 并分配给 PROPSETID_VIDCAP_EXTENSION_UNIT。

编写了一个示例应用程序来访问这个扩展单元。

IExtensionUnit * g_pIXCcontrol;
hr = CoCreateInstance(__uuidof(IExtensionUnit), NULL, CLSCTX_INPROC_SERVER, 
    IID_IExtensionUnit, (void **)&g_pIXCcontrol);

我面临什么问题?

CoCreateInstance 返回类未注册 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)

我已经通过命令提示符使用 regsvr32 命令注册了 uvcplgn.ax,该命令又会抛出成功注册的消息。但是即使注册后,CoCreateInstance 也会抛出 class not registered 错误。

这可能是什么原因? MSDN 示例是否遗漏了正确注册扩展单元的内容?

提前致谢

【问题讨论】:

  • 请问@Spark,在您创建的UVC 扩展单元中,您是否创建了另一个可以与之对话的模块/程序/脚本?我问是因为我有一个 RealSense 410 (DS5) 相机,我想操纵它的 LASER 扩展控制。或者,您知道代码 sn-ps(最好是 Python)演示如何与 UVC 扩展单元控件交互(最好使用 OpenCV 或 libv4l2)?

标签: windows com usb driver directshow


【解决方案1】:

CoCreateInstance 的第一个参数必须是 COM 类标识符,CLSID__uuidof(IExtensionUnit) 成功或以其他方式预期成功的可能性接近于零。

您应该改用CLSID_ExtensionUnit(来自该示例)。

UPD。代码 sn -p 使某些 CLSID 可用于代码。

// Copy your CLSID of interest here in place of XXXXXXXX-YYYY-...
class __declspec(uuid("XXXXXXXX-YYYY-...")) ExtensionUnit; 
CoCreateInstance(__uuidof(ExtensionUnit), ...

【讨论】:

  • 但是 CLSID_ExtensionUnit 不会被导出到在构建 interface.idl 时创建的 interface.h 或 interface_i.c。因此,我在本地应用程序中重新定义了 CLSID,如下所示。 DEFINE_GUID(CLSID_ExtensionUnit, 0xe4a0682d, 0xda3c, 0x442f, 0xa3, 0xdc, 0x6c, 0x83, 0x41, 0xc3, 0xec, 0x89);我收到了看起来不相关的未解决的外部符号错误。错误 LNK2001:未解析的外部符号 _CLSID_ExtensionUnit 所以我使用 __uuidof(IExtensionUnit) 作为 CoCreateInstance 的第一个参数。
  • 当我们注册(使用 regsvr32.exe)这个扩展单元 uvcxuplgn.ax 时,应该在注册表中创建以下键的条目。 HKCR\CLSID\{e4a0682d-da3c-442f-a3dc-6c8341c3ec89}。但我在注册表中没有看到任何这样的键。由于没有创建密钥,因此 CoCreateInstance 失败。我的理解对吗?
  • 如果未导出,只需将 CLSID 声明复制到客户端应用程序中即可。无论如何,您必须在那里使用正确的 GUID。
  • 是的,我也做了同样的事情,但是之后我收到了未解决的外部符号错误。我已经交叉验证了我在应用程序和扩展单元中使用的 CLSID 的 GUID。
  • 很可能你做错了,检查上面的更新,看看最简单的方法(出错的可能性最小)。
【解决方案2】:

MSDN中提供的UVC Extension示例代码的dll相关功能和注册部分存在一些问题。我已经通过修改dll相关代码和接口接收代码暂时修复了这个问题。

现在我能够在我的应用程序中获得完美的接口,并能够通过扩展单元与 UVC USB 相机进行通信。

感谢您的支持Roman R

【讨论】:

  • 嘿伙计,我看到你成功开发了扩展单元。你能好心分享你的实现吗,这对我来说非常有用,因为我现在被困住了。你可以在 Github 上做一个 repo。谢谢,
  • 嘿 Sameed,抱歉,代码在我的组织的 NDA 之下。如果您在任何地方遇到困难,我很高兴为您提供帮助。让社区知道您面临的问题。
  • 或者您可以添加一个成功构建的示例项目?
  • 目前正在部分构建,请改进github.com/amilamad/uvc_extension_plugin
猜你喜欢
  • 2014-05-30
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
相关资源
最近更新 更多