我的代码被编译为Windows DLL与Visual C++。我想在调用terminate()
时记录罕见情况,因此我在库初始化函数中设置了terminate()
处理程序,后者在使用我的库之前由用户代码调用。我的处理程序写入日志并调用abort()
来模拟默认的terminate()
行为。如何检测是否安装了自定义的terminate()处理程序?
问题是用户代码也可能用C++编写,并使用相同的C++运行时版本,因此与我的库共享terminate()
处理程序。该代码可能还希望更改terminate()
处理程序以进行日志记录。所以他们会打电话set_terminate()
,然后加载并初始化我的库,我的库也会调用set_terminate()
并覆盖它们的terminate()
处理程序,这对他们来说很难检测到,因为terminate()
处理程序是他们将要测试的最后一个东西。
所以我想要以下内容。在库初始化函数中,我将retrieve the current terminate()
handler,找到它是否是一个标准的,然后如果它碰巧是一个非标准的函数,我将存储它的地址,稍后(如果需要)我的terminate()
处理程序将写入日志,然后将呼叫转移到该自定义terminate()
处理程序。
是否有可能找到当前安装的terminate()
处理程序是默认还是自定义程序?
如果你打算反正调用'abort',为什么不总是链接到前一个终止处理程序而不是调用'abort'? –
FWIW,我不认为链接以前的终止处理程序是一个好主意。如果程序死于代码中,请调用您的处理程序,如果在主机代码中,则调用主机处理程序。请参阅下面我的RAII答案以了解如何实现此目的。 – Ben