我的代码使用 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() 处理程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8984002/

10-09 05:25