In meinem aktuellen Projekt habe ich mehrere ATL-Projekte, die voneinander abhängen. Einer davon heißt "Common" und definiert eine Trace-Kategorie, die andere Projekte zum Ausdruck von Trace-Informationen verwenden können.Warum schlägt regsvr32 nach dem Upgrade eines ATL-Projekts auf VS2015.1 fehl?
ich die Kategorie aus der IDL-Datei wie so definiert:
cpp_quote("static ATL::CTraceCategory DATA_LAYER(_T(\"Data Layer\"), 1);")
Im Grunde ist dies in der gemeinsamen Header-Datei, auch andere Projekte in die folgende Definition übersetzt über die Schnittstellen des „Common“ Projekt informiert zu .
static ATL::CTraceCategory DATA_LAYER(_T("Data Layer"), 1);
Jetzt seit Visual Studio 2013 scheint es a change in how tracing funktioniert.
Dies ist Ursache-Quelle bricht Änderungen in einigen Verwendungen der
ATL::CTraceCategory
-Klasse, die Änderungen im Quellcode erforderlich, wenn zu Visual Studio 2013.
Und in der Tat migrieren, habe ich die Linie ändern oben durch den zweiten Parameter zu entfernen:
cpp_quote("static ATL::CTraceCategory DATA_LAYER(_T(\"Data Layer\"));")
Jetzt baut alles wieder, aber das Problem löst, sobald ich versuche, jedes Projekt neu zu erstellen, die die Trace-Kategorie verwendet. Nachdem der Build erfolgreich abgeschlossen wurde, registriert der Compiler die Komponente automatisch. Und während regsvr32 /s "C:\...\Common.dll"
ich immer eine Debug Geltendmachung wie folgt erhalten:
Microsoft Visual C++ Runtime Library
Debug Assertion Failed!
Programm: ... \ x64 \ Debug \ Common.dll
Datei: c: \ Programme (x86) \ Microsoft Visual Studio 14.0 \ vc \ atlmfc \ include \ atltrace.h
Line: 337
Expression:
false && "Too many categories defined"
Dies geschieht auch, wenn ich versuche, t registrieren Die Komponente manuell. Nur Projekte, die nicht vom gemeinsamen Projekt abhängen und daher keine Trace-Kategorie verwenden, werden erfolgreich registriert.
Hat jemand eine Lösung dafür? Ich würde auch eine Lösung akzeptieren, die eine andere Art der Rückverfolgung in ATL zeigt, da es keinen Unterschied zur Verwendung von DebugOutputString
stattdessen gibt (wenn ich den verlinkten Blog richtig verstanden habe).
Es ist die Art von Missgeschick, die Sie erhalten, wenn Sie Code verknüpfen, der nicht neu kompiliert wurde. Eine Bibliothek, die normalerweise mit einer alten Version von ATL erstellt wurde. –
@HansPassant Ich habe bereits die gesamte Lösung (einschließlich des gemeinsamen Projekts) neu erstellt, um sie mit der neuesten Version von ATL zu verknüpfen. Sie denken, das Problem ist, dass mindestens eine Lib mit einer älteren Version der ATL-Version verbunden ist? – Carsten