【发布时间】:2016-08-13 08:32:33
【问题描述】:
在我当前的项目中,我有多个相互依赖的 ATL 项目。其中一个称为“Common”,定义了一个跟踪类别,其他项目可能会使用它来打印出跟踪信息。
我从 IDL 文件中定义了这样的类别:
cpp_quote("static ATL::CTraceCategory DATA_LAYER(_T(\"Data Layer\"), 1);")
基本上这转换为公共头文件中的以下定义,其他项目包括了解“公共”项目的接口。
static ATL::CTraceCategory DATA_LAYER(_T("Data Layer"), 1);
现在自 Visual Studio 2013 以来似乎有 a change in how tracing 作品。
这确实会在
ATL::CTraceCategory类的某些使用中导致源代码中断更改,这将需要在迁移到 Visual Studio 2013 时更改源代码。
确实,我不得不通过删除第二个参数来更改上面的行:
cpp_quote("static ATL::CTraceCategory DATA_LAYER(_T(\"Data Layer\"));")
现在一切都重新构建了,但是当我尝试重新构建任何使用跟踪类别的项目时,问题就出现了。构建成功完成后,编译器会自动注册组件。在regsvr32 /s "C:\...\Common.dll" 期间,我总是收到这样的调试断言:
Microsoft Visual C++ 运行时库
调试断言失败!
程序:...\x64\Debug\Common.dll
文件:c:\program files (x86)\microsoft visual studio 14.0\vc\atlmfc\include\atltrace.h
行:337
表达式:
false && "Too many categories defined"
当我尝试手动注册组件时也会发生这种情况。只有不依赖公共项目,因此不使用任何跟踪类别的项目才能注册成功。
有人对此有解决方案吗?我也会接受在 ATL 中显示另一种跟踪方式的解决方案,因为使用 DebugOutputString 似乎没有任何区别(如果我正确理解链接的博客)。
【问题讨论】:
-
当您链接未重新编译的代码时,您会遇到这种不幸。一个通常使用旧版本 ATL 构建的库。
-
@HansPassant 我已经重建了整个解决方案(包括公共项目),以便将其链接到最新版本的 ATL。所以你认为问题在于至少有一个库链接到了旧版本的 ATL 版本?
标签: c++ com visual-studio-2015 atl regsvr32