C++ &引用;“协同初始化失败”;当一个函数(来自库)包含在VC++;MFC项目

C++ &引用;“协同初始化失败”;当一个函数(来自库)包含在VC++;MFC项目,c++,windows,visual-studio,mfc,C++,Windows,Visual Studio,Mfc,我知道这有点含糊不清,我只是在这里寻找一般的可能性,让我走上正确的轨道 我在MFC对话框程序中包含了两个lib和它们的.h,并编译了它,没问题。当我从一个lib调用函数时,它会弹出一个对话框,上面写着“Com错误”“CoInitialize失败”。这不是我真正调用函数的时候,而是程序开始运行的时候。我的假设是,当它看到函数时,它实际上在lib中调用,而当它看到函数时,可能会在我的MFC程序中的函数之前调用一个CoInit,从而产生冲突 在代码中,它似乎将此应用于CDialog::DoModal

我知道这有点含糊不清,我只是在这里寻找一般的可能性,让我走上正确的轨道

我在MFC对话框程序中包含了两个lib和它们的.h,并编译了它,没问题。当我从一个lib调用函数时,它会弹出一个对话框,上面写着“Com错误”“CoInitialize失败”。这不是我真正调用函数的时候,而是程序开始运行的时候。我的假设是,当它看到函数时,它实际上在lib中调用,而当它看到函数时,可能会在我的MFC程序中的函数之前调用一个CoInit,从而产生冲突

在代码中,它似乎将此应用于CDialog::DoModal

我总是可以补充更多的细节,我只是希望被引导到正确的方向。提前非常感谢您的帮助

编辑:


问题是,我不知道DLL在哪里调用CoInitialize。我真的不能发布代码,因为代码太多了,即使是一个简单的程序。我将尝试dependency walker并查看我的InitInstance。。。还有其他建议吗?非常感谢各位

一个好的方向是添加更多细节,特别是如果您有这些细节,比如CoInitialize返回的HRESULT是哪一个


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

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


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

尝试添加您自己对CoInitializeEx的调用,并确保您使用的是STA(SingleThreadedPartment)主线程中的线程


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

尝试添加您自己对CoInitializeX的调用,并确保您在主线程中使用STA(SingleThreadedPartment)线程


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

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


可能是此错误消息并不表示lib试图调用CoInitialize本身,而是尝试了其他COM调用,并且从它在那里收到的错误推断CoInitialize没有被您调用。

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


这可能是因为此错误消息并不表示库试图调用CoInitialize本身,而是尝试了其他COM调用,并且从它在那里收到的错误推断出CoInitialize没有被您调用。

一个常见错误是,如果引用的DLL丢失,那么在调用CoInitialize时,它会尝试加载DLL失败的原因是好的旧的失败。尝试使用dependency walker并检查您可能丢失的任何DLL。

一个常见错误是,如果引用的DLL丢失,那么当调用协同初始化时,它会尝试加载DLL,并以良好的旧E_FAIL失败。尝试使用dependency walker并检查您可能遗漏的任何DLL。

您可以通过在同一DLL上设置断点来找出谁在调用CoInitialize

这就是你使用的方法

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

为此

  • 运行gflags.exe 在图像文件选项中,指定exe的名称,如xyz.exe。 按tab键启用图像级别选项。 在调试器选项中,键入windbg-g的完整路径
  • 这将导致每次启动xyz.exe时,都会使用附加的调试器启动exe

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

    bp Ole32!共同初始化

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

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


    希望它对您有所帮助

    您可以通过在同一页上设置断点来找出谁在调用CoInitialize

    这就是你使用的方法

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

    为此

  • 运行gflags.exe 在图像文件选项中,指定exe的名称,如xyz.exe。 按tab键启用图像级别选项。 在调试器选项中,键入windbg-g的完整路径
  • 这将导致每次启动xyz.exe时,都会使用附加的调试器启动exe

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

    bp Ole32!共同初始化

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

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


    希望它能帮助您

    用实际的源代码调试这样的问题总是最容易的,尤其是您可以创建的显示问题的最小示例。“最容易调试”适用于那些没有看到源代码的人,而是依赖于你的描述。用实际的源代码调试这样的问题总是最容易的,尤其是你能创建的显示问题的最小示例。“最容易调试”为那些没有看到来源,而是依赖于你描述的人。