В некоторых случаях ошибки ATL вызывает AtlThrow()
, который реализован как ATL::AtlThrowImpl()
, который в свою очередь выдает CAtlException
. Последнее не очень хорошо - CAtlException
даже не является производным от std::exception
, и мы также используем нашу собственную иерархию исключений, и теперь нам придется ловить CAtlException
отдельно здесь и там, что является большим количеством дополнительного кода и подвержено ошибкам .
Похоже, можно заменить ATL::AtlThrowImpl()
на мой собственный обработчик - определите _ATL_CUSTOM_THROW
и определите AtlThrow()
в качестве пользовательского обработчика перед включением atlbase.h
- и ATL вызовет пользовательский обработчик.
Не так просто. Часть кода ATL отсутствует в исходных кодах - она поставляется в виде библиотеки - статической или динамической. Мы используем статический - atls.lib
. И ... он скомпилирован таким образом, что внутри него есть ATL::ThrowImpl()
и некоторый код, вызывающий его. Я использовал инструмент статического анализа - он ясно показывает, что есть пути, по которым вызывается старый обработчик по умолчанию.
Чтобы убедиться, что я даже попытался "переопределить" ATL::AtlThrowImpl()
в своем коде. Теперь компоновщик говорит, что видит два объявления ATL::AtlThrowImpl()
, которые, как я полагаю, подтверждают, что есть другая реализация, которая может быть вызвана некоторым кодом.
Как я могу справиться с этим? Как полностью заменить обработчик по умолчанию и гарантировать, что обработчик по умолчанию никогда не вызывается?