【问题标题】:combase error (CoInitialize has not been called)combase 错误(尚未调用 CoInitialize)
【发布时间】:2018-04-05 16:25:50
【问题描述】:

onecore\com\combase\objact\objact.cxx(812)\combase.dll!00007FF8BD322169: (caller: 00007FF8BD320F78) ReturnHr(1) tid(b54) 800401F0 CoInitialize 没有被调用。

我正在使用 Visual Studio 2015 并开始收到以下错误消息。我不是在尝试编写 dll 或使用 COM 对象或其他任何东西。这只是一个简单的 OpenGL 程序。我不知道这个错误消息是从哪里来的。我该如何摆脱它?

【问题讨论】:

  • 请给我们代码。检查调试器中的程序。让我们有机会帮助我们提供更多信息!
  • 代码无济于事,因为自上次工作以来我没有更改任何内容。加上代码是许多文件中的数千行。我会发布什么代码?
  • 在这种情况下,您必须告诉我们更多关于代码结构的信息。请参阅 Daniel Sęk 的回答。如果您不写更多内容,如果您的问题被关闭,这应该不足为奇。

标签: c++ dll com


【解决方案1】:

您正在隐式使用 COM。没有代码,我们无法确切知道。它可能来自 shell api、通用文件对话框、操纵杆处理等。

您需要将CoInitialize( 0 ); 放在某个主函数(或WinMain 或wWinMain)的开头,并将CoUninitialize(); 放在函数结尾。如果需要使用特定的并发模型,还有CoInitializeEx

CoInitialize description

【讨论】:

  • 谢谢,但我不能发布代码,因为它没有多大帮助。它是许多单独模块中的成千上万行代码。发布代码无济于事。几个月来,我实际上没有对代码进行任何更改。我最近才回到它并有这个错误。这没有意义。我想可能是因为我更新了 VS2015 软件。我确实使用 DirectX 来读取 Xbox 控制器。也许是这样,
  • 感谢这个解决方案解决了这个问题。
  • 这个警告的后果是什么?除了令人讨厌的事实之外,为什么要禁止显示警告?
  • 如果没有正确设置线程模型,使用组件的 COM 可能会失败。似乎某些组件通过自己调用来纠正缺少的CoInitializeCoInitializeEx。有时您可能会得到相互冲突的模型,因此最好在应用程序启动时明确选择它。
【解决方案2】:

我的程序在 WinMain 中调用 CoInitialize(NULL),但在加载一些 DLL 时(运行后)我仍然看到此错误。 但是,在尝试枚举系统中的声卡时,我遇到了同样的错误。 解决方案是使用 CoInitializeEx(NULL, COINIT_MULTITHREADED),这将确保允许来自任何线程的 COM 调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多