C++ CoCreateInstance在发行版中工作得很好,但在调试中却不行';T

C++ CoCreateInstance在发行版中工作得很好,但在调试中却不行';T,c++,debugging,dll,com,C++,Debugging,Dll,Com,我是COM的新手,在调试dll时遇到问题。在此代码中: _Check_return_ HRESULT CoCreateInstance(_In_ REFCLSID rclsid, _In_opt_ LPUNKNOWN pUnkOuter = NULL, _In_ DWORD dwClsContext = CLSCTX_ALL) throw() { ATLASSERT(p == NULL); return ::CoCreate

我是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.

哪里有错误?

看起来问题是混合了MS CRT库的
调试
发布
汇编版本
Microsoft.VC80.CRT
Microsoft.DebugVC80.CRT
程序集使用相同的公用公钥令牌
“1FC8B3B9A118E3B”
,因此它们不能同时加载到单个应用程序中

在您的例子中,
rwuxtemes.dll
的清单指的是
Microsoft.VC80.CRT
,但
Debug
中的应用程序清单指的是
Microsoft.DebugVC80.CRT
。试图加载
rwuxtemes.dll
会导致错误,说明实际上是不正确的,它应该是“无法加载另一个程序集已经使用了公钥的程序集”

可能的解决方案:您需要调试版本的
rwuxtemes.dll
链接到调试版本中的应用程序。假设其名称为
RWUXThemeSD.dll

请参阅(社区内容,主要文章看起来与您的问题无关)


rwuxteme
库是Rogue Wave Stingray Studio的一部分,请参阅。

错误告诉您rwuxtemes.dll是在没有调试信息的情况下构建的,您无法调试到此库中。您是否可以跳过此调用而不是单步执行它?“应用程序试图错误地加载C运行时库”可能表示缺少crt DLL或混合调试/发布运行时。使用Dependency Walker来解决问题。如果我跳过一步,就会出现错误,应用程序试图错误地加载C运行时库。Dependency Walker。嗯。我会尝试DLL没有正确构建,它缺少所需的清单。您需要从DLL所有者那里获得帮助。在VS2008的模块窗口中,我找到了RWUXThemeSD.DLL。它带有消息“模块未加载默认加载地址”。在RWUXThemeSD.dll状态下,同样的问题是“二进制文件没有使用调试信息生成”。参考Rogue Wave Stingray Studio文档,可能是我错了,调试库名称不同。因此,对于调试生成,您需要应用程序链接到
RWUXThemeSD.dll
,而不是
RWUXThemeS.dll
。检查其他DLL(如果有),它们也必须遵循此规则。