【问题标题】:Failed CoCreateInstance失败的 CoCreateInstance
【发布时间】:2015-07-20 23:44:10
【问题描述】:

我有一个调用 CoCreateInstance 的函数。此函数被多次调用并且可以正常工作,但是有一次 CoCreateInstance 因“错误的变量类型”错误而失败。问题是成功和失败时的参数总是相同的。什么可能导致这种情况发生?

【问题讨论】:

  • 这可能来自组件代码 - 它可以是任何东西。你有那个组件源代码吗?
  • 您需要更具体地了解该错误。那是COM结果代码吗?你想创建什么样的对象。
  • 我有源代码,但它非常大。这是一个COM结果代码,是的。我不知道它创建的对象的很多细节。我没有得到的是参数相同但它失败了......必须改变行为,对吗?那会是什么?
  • @Luchian Grigore 这可能是各种内存损坏......这个功能应该做什么?
  • 它应该调用DllGetClassObject(),然后在检索到的类工厂中调用CreateInstance()

标签: c++ com atl


【解决方案1】:

我的代码中还有一个函数调用 CoCreateInstance(...)。一次有效,另一次无效,无需更改代码。
但是当查看返回的 HRESULT 时,结果是内存不足错误,“E_OUTOFMEMORY 内存不足”。我确实对这些主题进行了一些研究,发现可能发生这种情况的原因如下。

  1. 您必须先调用 CoInitialize()

必须在调用 CoCreateInstance 函数之前调用 CoInitialize 函数

  1. COM 对象注册不正确

当 COM 对象(或代理存根)未正确注册时,通常会发生这种情况。您可以通过尝试实例化对象来使用 Oleview 工具检查 COM 对象的注册。

Oleview.exe 包含在 Windows SDK 中,位置通常位于 C:\Program Files\Microsoft SDKs\Windows\v6.0\Bin。

如果不存在,您可以尝试为 Windows Server 2008 安装 Microsoft Windows SDK:http://www.microsoft.com/downloads/details.aspx?FamilyId=F26B1AA4-741A-433A-9BE5-FA919850BDBF&displaylang=en

注意:它不仅适用于 Windows 2008,它只是以最近的 Windows 版本命名,它支持 Windows Server 2003;视窗服务器 2008;视窗Vista; Windows XP。

  1. 不正确的 DLL 版本丢失、损坏

对我来说,这发生在不同的项目配置中,在调试模式下我发现了异常,但在发布时它没有出现。

【讨论】:

    【解决方案2】:

    我解决了这个问题。 调用是从不同的线程进行的。当调用成功时,它是从主线程调用的。失败时,源是另一个线程,并且 CoInitialize() 没有事先调用。 调用 CoInitialize 解决了这个问题。

    【讨论】:

    • 这很奇怪。通常当你在CoInitialize() 之前调用CoCreateInstance() 时,你会得到一个可识别的“CoInitialize has not been called error”。
    • 不是真的,在很多情况下没有 CoInitialize() 我收到了一个与任何事情无关的疯狂错误。
    猜你喜欢
    • 2010-09-24
    • 1970-01-01
    • 2014-04-09
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2010-09-20
    相关资源
    最近更新 更多