Мой код скомпилирован как Windows DLL с Visual C ++.Я хочу регистрировать редкие случаи, когда вызывается terminate()
, поэтому я установил свой обработчик terminate()
в функцию инициализации библиотеки, и последний вызывается кодом пользователя перед использованием моей библиотеки.Мой обработчик пишет в журнал и вызывает abort()
, имитируя поведение terminate()
по умолчанию.
Проблема в том, что пользовательский код также может быть написан на C ++ и использовать ту же самую версию C ++ во время выполнения, и поэтому использовать terminate()
обработчик с моей библиотекой.Этот код может также захотеть изменить обработчик terminate()
, чтобы он регистрировал их.Поэтому они будут вызывать set_terminate()
, затем загружать и инициализировать мою библиотеку, а моя библиотека также будет вызывать set_terminate()
и переопределять их обработчик terminate()
, и это будет очень трудно для них обнаружить, так как обработчик terminate()
является последнимЯ думаю, они проверят.
Так что я хочу следующее.Внутри функции инициализации библиотеки я получу текущий обработчик terminate()
, выясню, является ли он стандартным, затем, если он окажется нестандартным, я сохраню его адрес и позже (еслинеобходимо) мой обработчик terminate()
запишет в журнал и затем перенаправит вызов этому пользовательскому обработчику terminate()
.
Можно ли определить, является ли установленный обработчик terminate()
установленным по умолчанию, илизаказной?