当VC ++ MFC项目中包含一个函数(来自lib)时,“CoInitialize失败”

时间:2009-04-14 15:32:53

标签: c++ windows visual-studio mfc

我知道这有点模糊,我只是为了让我走上正确的道路而在这里拍摄一般的可能性。

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

单步执行代码,似乎把它放在CDialog :: DoModal

我总是可以添加更多细节,我只是希望能够朝着正确的方向前进。非常感谢您的任何帮助!

修改

问题是,我不知道DLL在哪里调用CoInitialize。我真的无法发布代码,因为即使对于一个简单的程序来说,也只是太多了。我会尝试依赖walker并查看我的InitInstance ...还有其他任何建议吗?非常感谢你们

5 个答案:

答案 0 :(得分:3)

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

有可能将您的主要线程设置为MTA,但您的库需要并且需要STA,因此它的CoInitialize调用失败。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

可能是这个错误消息并没有表明lib试图调用CoInitialize本身,而是尝试了一些其他的COM调用,并从它收到的错误中推断出你没有调用CoInitialize。

答案 3 :(得分:1)

你可以通过在同一个地方设置一个断点来找出谁在调用CoInitialize。

这是您使用Debugging Tools for Windows执行此操作的方式。

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

为此

  1. 运行gflags.exe 在图像文件选项中,给出exe的名称,说xyz.exe。 按Tab键启用图像级别选项。 在调试器选项中,键入 windbg的完整路径 -g
  2. 这将导致每次启动xyz.exe时都会使用调试器启动exe。

    现在在CoInitialize调用上设置断点,打破Windbg中的执行。 在命令窗格中键入

    bp Ole32!CoInitialize

    停止调试,在提示并重新启动xyz.exe时保存工作区

    这次,当有人调用CoInitialize时,应用程序将进入调试器。

    希望它可以帮到你

答案 4 :(得分:0)

常见错误是如果引用的DLL丢失,那么当调用CoInitialize时,它会尝试加载DLL并使用旧的E_FAIL失败。尝试使用依赖性walker并检查您可能错过的任何DLL。