C++ CoCreateInstance在发行版中工作得很好,但在调试中却不行';T
我是COM的新手,在调试dll时遇到问题。在此代码中: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
_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(如果有),它们也必须遵循此规则。