2009-04-14 133 views
0

我知道这有些含糊,我只是为了让我走上正确的轨道而拍摄一般可能性。当VC++ MFC项目中包含一个函数(来自lib)时,“CoInitialize失败”

我在我的MFC对话框程序中包含了两个库和它们的.h文件并编译它,没问题。当我从其中一个库调用某个函数时,它会弹出一个对话框,提示“Com Error”“CoInitialize Failed”。当我实际上调用函数时,并不是当程序开始运行时。我的假设是,当它看到这个函数时,它实际上在lib中调用,并且当它发生时,可能CoInit会在我的MFC程序之前被调用,从而产生冲突?

步进通过代码,似乎在CDialog的:的DoModal

我可以随时添加更多的细节抛出这个,我只是希望在正确的方向得到转向。提前感谢您提供任何帮助!

编辑:

的事情是,我不知道该DLL的调用CoInitialize。我真的不能发布代码,因为即使对于一个简单的程序来说也是太多了。我会尝试依赖沃克和检查我的InitInstance ...任何其他建议?非常感谢

+0

它总是最容易调试问题这样与实际的源代码,尤其是最小的例子,你可以创建一个展示的问题。 – 2009-04-15 00:25:11

回答

1

一个好的方向是添加更多的细节,特别是如果你有它们,比如哪个是CoInitialize返回的HRESULT?

我的猜测是,这样的lib有一个静态初始化,如果dll中没有函数被调用,它们会被链接器丢弃,但是如果至少有一个函数被调用,那么静态初始化器会被链接。

3

尝试将您自己的调用添加到CoInitializeEx,并确保您在主线程中使用STA(SingleThreadedApartment)线程。

机会是将您的主线程设置为MTA,但您的库期望并需要STA,因此它的CoInitialize调用失败。

1

你应该在你的App InitInstance()中调用CoInitialize。然后它应该在调用DoModal()之前执行。

可能是因为这个错误信息并不表示该lib试图调用CoInitialize本身,而是尝试了一些其他COM调用,并且从它收到的错误中推断出CoInitialize没有被您调用。

0

一个常见的错误是,如果引用的DLL丢失,所以当CoInitialize被调用时,它会尝试加载该DLL并失败,并出现旧的E_FAIL。尝试使用依赖walker并检查您可能错过的任何DLL。

1

您可以通过在相同的位置放置一个断点找出谁在呼叫CoInitialize。

这是您使用Debugging Tools for Windows的方法。

您首先启用调试器选项使用gflags.exe为您的exe。

对于

  1. 运行gflags.exe 在图像文件选项给你的exe的名字说xyz.exe。 按下标签启用图像级别选项。 在调试选项类型全路径的WinDbg -g

这将导致你的EXE正在启动与调试器附着每次启动xyz.exe。

现在,要在CoInitialize调用上设置断点,请在Windbg中中断执行。 在命令面板类型

BP OLE32!CoInitialize的

停止调试,保存工作区时,它会提示重启xyz.exe

这个时候如果有人拨打CoInitialize的应用程序将中断到调试器。

希望它可以帮助你

相关问题