我知道这有点模糊,我只是为了让我走上正确的道路而在这里拍摄一般的可能性。
我在我的MFC Dialog程序中包含两个lib和它们的.h并编译它,没问题。当我从其中一个库中调用一个函数时,它会弹出一个对话框,显示“Com Error”“CoInitialize Failed”。那不是我实际调用函数的时候,一旦程序开始运行。我的假设是,当它看到函数时,它实际上是在lib中调用,当它发生时,可能是在我的MFC程序中调用CoInit之前调用CoInit,从而产生冲突?
单步执行代码,似乎把它放在CDialog :: DoModal
我总是可以添加更多细节,我只是希望能够朝着正确的方向前进。非常感谢您的任何帮助!
修改
问题是,我不知道DLL在哪里调用CoInitialize。我真的无法发布代码,因为即使对于一个简单的程序来说,也只是太多了。我会尝试依赖walker并查看我的InitInstance ...还有其他任何建议吗?非常感谢你们
答案 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启用调试器选项。
为此
这将导致每次启动xyz.exe时都会使用调试器启动exe。
现在在CoInitialize调用上设置断点,打破Windbg中的执行。 在命令窗格中键入
bp Ole32!CoInitialize
停止调试,在提示并重新启动xyz.exe时保存工作区
这次,当有人调用CoInitialize时,应用程序将进入调试器。
希望它可以帮到你
答案 4 :(得分:0)
常见错误是如果引用的DLL丢失,那么当调用CoInitialize时,它会尝试加载DLL并使用旧的E_FAIL失败。尝试使用依赖性walker并检查您可能错过的任何DLL。