【问题标题】:CoCreateInstance works great in Release but in debug doesn'tCoCreateInstance 在 Release 中效果很好,但在调试中却不行
【发布时间】:2012-11-12 10:09:42
【问题描述】:

我是 COM 新手,在调试 dll 时遇到问题。在这段代码中:

        _Check_return_ HRESULT CoCreateInstance(_In_ REFCLSID rclsid, _In_opt_ LPUNKNOWN pUnkOuter = NULL, _In_ DWORD dwClsContext = CLSCTX_ALL)  
throw()  
    {  
        ATLASSERT(p == NULL);  
        return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&p);  
    }

作为回报,我有错误 R6034:应用程序试图错误地加载 C 运行时库。

另外:在 VS 2008 的输出窗口中,我注意到调试在某些消息处停止:

'OmpClimApp.exe': Loaded '\\omegaserver\omega\app32\OMEGA.DLL\RWUXThemeS.dll', Binary was not built with debug information.

哪里出错了?

【问题讨论】:

  • 错误告诉你RWUXThemeS.dll是在没有调试信息的情况下构建的,你不能调试到这个库中。你能跳过这个电话而不是介入吗?
  • “应用程序试图错误地加载 C 运行时库”可能表明缺少 crt dll 或混合调试/发布运行时。使用 Dependency Walker 找出问题所在。
  • 如果我跳过我得到错误应用程序试图错误地加载 C 运行时库。
  • 依赖步行者。唔。我试试
  • DLL 未正确构建,它缺少所需的清单。您需要从 DLL 所有者那里获得帮助。

标签: c++ debugging dll com


【解决方案1】:

看起来问题在于混合了 MS CRT 库的 DebugRelease 程序集版本。 Microsoft.VC80.CRTMicrosoft.DebugVC80.CRT 程序集使用相同的公共 publicKeyToken "1fc8b3b9a1e18e3b",因此它们不能同时加载到单个应用程序中。

在您的情况下,RWUXThemeS.dll 的清单指的是Microsoft.VC80.CRT,但您的应用程序在Debug 构建中的清单指的是Microsoft.DebugVC80.CRT。尝试加载RWUXThemeS.dll 导致错误描述实际上不正确,应该是“无法加载程序集,其公钥已被另一个程序集使用”。

可能的解决方案:您需要RWUXThemeS.dll 的调试版本才能在调试版本中链接到您的应用程序。假设它的名字是RWUXThemeSD.dll

参见MSDN for more details(社区内容,主文章看起来与您的问题无关)。

RWUXTheme 库是 Rogue Wave Stingray Studio 的一部分,请参阅 documentation

【讨论】:

  • 在 VS2008 的 Modules 窗口中,我找到了 RWUXThemeSD.dll。它带有消息“模块未加载默认加载地址”。在 RWUXThemeSD.dll 的状态下,同样的问题“二进制文件没有使用调试信息构建。”
  • 参考 Rogue Wave Stingray Studio 文档,可能我错了,调试库名称不同。
  • 因此,对于调试构建,您需要将您的应用链接到 RWUXThemeSD.dll 而不是 RWUXThemeS.dll。检查其他 DLL(如果有),它们也必须遵循此规则。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 2020-08-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
相关资源
最近更新 更多