c – 如何检测是否安装了自定义terminate()处理程序?
发布时间:2020-12-16 07:28:41 所属栏目:百科 来源:网络整理
导读:我的代码使用Visual C编译为 Windows DLL.我想记录在调用terminate()时的罕见情况,所以我在库初始化函数中设置了terminate()处理程序,后者在使用我的库之前由用户代码调用.我的处理程序写入日志并调用abort()模拟默认的terminate()行为. 问题是用户代码也可
我的代码使用Visual C编译为
Windows DLL.我想记录在调用terminate()时的罕见情况,所以我在库初始化函数中设置了terminate()处理程序,后者在使用我的库之前由用户代码调用.我的处理程序写入日志并调用abort()模拟默认的terminate()行为.
问题是用户代码也可能用C编写并使用完全相同的C运行时版本,因此与我的库共享terminate()处理程序.该代码可能还希望更改terminate()处理程序以进行日志记录.所以他们会调用set_terminate(),然后加载并初始化我的库,我的库也会调用set_terminate()并覆盖他们的terminate()处理程序,这将是他们很难检测到的,因为terminate()处理程序是最后一件事我想他们会考试. 所以我想要以下内容.在库初始化函数里面我将retrieve the current 是否可以找到当前安装的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 } 如果您完全确定需要,可以使用前一个处理程序链. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |