失败的 CoCreateInstance

Failed CoCreateInstance

提问人:Luchian Grigore 提问时间:7/13/2011 更新时间:7/20/2015 访问量:13180

问:

我有一个函数,我在其中调用 CoCreateInstance。此函数被多次调用,并且它有效,但是有一次 CoCreateInstance 失败,并出现“错误的变量类型”错误。问题是,无论是成功还是失败,参数总是相同的。是什么原因导致这种情况发生?

C++ COM ATL

评论

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

答:

5赞 Luchian Grigore 7/20/2011 #1

我解决了这个问题。 调用是从不同的线程发出的。当调用成功时,它是从主线程调用的。失败时,源线程是其他线程,并且事先未调用 CoInitialize()。 调用 CoInitialize 解决了该问题。

评论

0赞 sharptooth 7/20/2011
这很奇怪。通常,当您调用时,在收到可识别的“CoInitialize 尚未调用错误”之前。CoCreateInstance()CoInitialize()
0赞 10/21/2011
并非如此,在许多情况下,如果没有 CoInitialize(),我就会收到一个与任何事情无关的疯狂错误。
9赞 Merav Kochavi 7/20/2015 #2

我的代码中还有一个函数调用 CoCreateInstance(...)。当一次它起作用而另一次它不起作用时,无需更改代码。
但是,当查看返回的 HRESULT 时,结果是 Out of Memeory Error,“E_OUTOFMEMORY Runs out of memory”。我确实对这些主题进行了一些研究,并发现了以下可能发生这种情况的原因。

  1. 您必须首先调用 CoInitialize()

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

  1. COM 对象注册不正确

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

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

如果没有,您可以尝试安装Microsoft适用于 Windows Server 2008 的 Windows SDK:http://www.microsoft.com/downloads/details.aspx?FamilyId=F26B1AA4-741A-433A-9BE5-FA919850BDBF&displaylang=en

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

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

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