c – 如何检测是否安装了自定义terminate()处理程序?

c – 如何检测是否安装了自定义terminate()处理程序?,第1张

概述我的代码使用Visual C编译为 Windows DLL.我想记录在调用terminate()时的罕见情况,所以我在库初始化函数中设置了terminate()处理程序,后者在使用我的库之前由用户代码调用.我的处理程序写入日志并调用abort()模拟默认的terminate()行为. 问题是用户代码也可能用C编写并使用完全相同的C运行时版本,因此与我的库共享terminate()处理程序.该代码可 我的代码使用Visual C编译为 Windows DLL.我想记录在调用terminate()时的罕见情况,所以我在库初始化函数中设置了terminate()处理程序,后者在使用我的库之前由用户代码调用.我的处理程序写入日志并调用abort()模拟默认的terminate()行为.

问题是用户代码也可能用C编写并使用完全相同的C运行时版本,因此与我的库共享terminate()处理程序.该代码可能还希望更改terminate()处理程序以进行日志记录.所以他们会调用set_terminate(),然后加载并初始化我的库,我的库也会调用set_terminate()并覆盖他们的terminate()处理程序,这将是他们很难检测到的,因为terminate()处理程序是最后一件事我想他们会考试.

所以我想要以下内容.在库初始化函数里面我将retrieve the current terminate() handler,查找它是否是标准的,然后如果它恰好是非标准的,我将存储其地址,稍后(如果需要)我的terminate()处理程序将写入日志然后将调用转发给该自定义terminate()处理程序.

是否可以找到当前安装的terminate()处理程序是默认处理程序还是自定义处理程序?

解决方法 通过RAII这样做:

class terminate_scope{public:  terminate_function _prev;  terminate_scope(terminate_function f = NulL){     _prev = set_terminate(f);  }  ~terminate_scope(){     set_terminate(_prev);  }};

使用:

voID MyFunctionWantsOwnTerminateHandler(){    terminate_scope termhandler(&OwnTerminateHandler);    // terminate handler Now set    // All my code will use that terminate handler    // On end of scope,prevIoUs terminate handler will be restored automatically}

如果您完全确定需要,可以使用前一个处理程序链.

总结

以上是内存溢出为你收集整理的c – 如何检测是否安装了自定义terminate()处理程序?全部内容,希望文章能够帮你解决c – 如何检测是否安装了自定义terminate()处理程序?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1229986.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存