【问题标题】:Why do i get failed to initialize COM library?为什么我无法初始化 COM 库?
【发布时间】:2013-12-31 16:53:20
【问题描述】:

我正在尝试在 C++ 中测试有关 WMI 通知的 msdn 示例,该示例位于此处:Qt5.2 项目中的Example: Receiving Event Notifications Through WMI。一切都编译得很好并且运行良好,但是当我尝试运行示例代码时,我一开始就卡住了!
我得到了错误:

无法初始化 Com 库

我在某处读到Qt 本身似乎初始化了 com 对象,因此无需重新初始化它。
在这种情况下,如果我评论初始化部分,我会收到 CoInitializeSecurity 失败错误。!
我在这里想念什么?

【问题讨论】:

  • 如果 Qt 为您初始化 COM,这是 Qt 中的一个缺陷。 Qt 不可能知道如何为您初始化 COM,因为它不知道您的线程应该在哪个 Appartment 中。示例代码尝试将线程初始化为在多线程 Appartment 中。如果失败,显然 Qt 为单线程公寓初始化了线程。 编辑:请同时提供错误代码。
  • 谢谢,这是我得到的错误代码:无法初始化 COM 库。错误代码 = 0xffffffff80010106 这是我记录错误而不是 cout 的代码! ui->txtLog->setText("初始化COM库失败。错误码=0x" + QString::number(hrs,16));
  • 错误代码 0x80010106 转换为:“设置后无法更改线程模式。” 要运行示例代码,您必须创建一个新线程并祈祷 Qt 停止作为一个 PITA。
  • 尝试使用这个:std::thread t(&frmProcess::WMIMethod2,this); t.join();而不是简单地调用 WMIMethod2,结果是这样的:i43.tinypic.com/289dlrr.jpg
  • 我想这是我上面暗示的Qt不再是PITA的祈祷部分。

标签: c++ events notifications wmi qt5


【解决方案1】:

来自MSDN

多线程单元供non-GUI 线程使用。 多线程单元中的线程不应执行 UI 操作。 这是因为 UI 线程需要消息泵,而 COM 不需要 为多线程单元中的线程泵送消息。

我尝试了一个基于控制台的应用程序,而不是 qt 中的 GUI 应用程序,它可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-24
    相关资源
    最近更新 更多