Мой код скомпилирован как Windows DLL с Visual C++. Я хочу регистрировать редкие случаи, когда вызывается terminate()
, поэтому я устанавливаю обработчик terminate()
в функцию инициализации библиотеки, а последний вызывается кодом пользователя перед использованием моей библиотеки. Мой обработчик записывает в журнал и вызывает abort()
, эмулируя поведение по умолчанию terminate()
.Как определить, установлен ли пользовательский обработчик terminate()?
Проблема заключается в том, что код пользователя также может быть написан на C++ и использовать ту же самую версию исполнения на C++ и, таким образом, совместно использовать обработчик terminate()
с моей библиотекой. Этот код может также захотеть изменить обработчик terminate()
для ведения журнала. Поэтому они назовут , затем загрузите и инициализируйте мою библиотеку, и моя библиотека также вызовет и переопределит их обработчик terminate()
, и это будет очень сложно обнаружить, поскольку обработчик terminate()
- это последнее, что они проверили, я полагаю.
Поэтому я хочу следующее. Внутри функции инициализации библиотеки я буду retrieve the current terminate()
handler, найдите, является ли она стандартной, тогда, если она окажется нестандартной, я сохраню ее адрес и позже (при необходимости) мой обработчик terminate()
будет записывать в журнал, а затем переадресуйте вызов этому настраиваемому обработчику terminate()
.
Возможно ли найти установленный в данный момент обработчик terminate()
по умолчанию или по умолчанию?
Если вы намереваетесь называть 'abort' в любом случае, почему бы вам просто не перекодировать предыдущий обработчик завершения, а не вызывать' abort'? –
FWIW, я не думаю, что привязка предыдущего обработчика завершения - отличная идея. Если программа умирает в вашем коде, вызовите обработчик, если в хост-коде вызовите обработчик хоста. См. Мой ответ RAII ниже, как это сделать. – Ben