В моем текущем проекте у меня есть несколько проектов 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, похоже, есть изменение в работе трассировки.
Это вызывает критические изменения в некоторых случаях использования класса
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
(если я правильно понял связанный блог).