【问题标题】:How can I retrieve current terminate() handler without changing it?如何在不更改的情况下检索当前的 terminate() 处理程序?
【发布时间】:2011-01-13 02:28:39
【问题描述】:

这就是问题所在。我的应用程序调用CoCreateInstance() 来创建一个在第三方DLL 中实现的COM 对象。该 DLL 调用 set_terminate() 来更改 terminate() 处理程序并在那里传递它自己的 terminate() 处理程序的地址。

初始的terminate() 处理程序地址没有被那个库保存——它不关心,只是简单地改变处理程序并且从不恢复它。一旦 DLL 被卸载,它的代码就不再在进程内存中,所以如果现在调用 terminate(),程序会运行到未定义的行为。

我想检索并存储初始terminate() 处理程序的地址,以便能够恢复它。我该怎么做?

【问题讨论】:

  • 您能否提及那个 DLL 是什么,以便其他人也可以得到警告?
  • @Rob Kennedy:它是特定于域的,因此任何人 1. 使用它和 2. 实际受到所描述行为打击的机会都可以忽略不计。另外,我们现在正试图说服供应商的支持他们应该修复它。

标签: c++ visual-c++ error-handling terminate


【解决方案1】:

标准 C++ 没有提供内置方式。

当然你可以调用 terminate() 两次:第一次使用你拥有的任何虚拟处理程序(然后存储 terminate() 返回给你的处理程序);第二——恢复你刚刚存储的处理程序;)简单的技巧。

【讨论】:

    【解决方案2】:

    在 C++11 中,您调用 std::get_terminate。

    【讨论】:

      【解决方案3】:

      你的意思是这样的:

      terminate_handler oldHandler;
      
      void onDllLoad()
      {
          oldHandler = set_terminate (newHandler);
      }
      
      void onDllUnload()
      {
          set_terminate (oldHandler);
      }
      
      void newHandler()
      {
      }
      

      【讨论】:

        猜你喜欢
        • 2021-08-22
        • 2019-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多