如何在不更改的情况下检索当前的terminate()处理程序?

时间:2010-02-04 14:16:46

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

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

初始terminate()处理程序地址不会被该库保存 - 它不关心并只是更改处理程序而永远不会恢复它。一旦DLL被卸载,它的代码就不再存在于进程内存中,所以如果现在调用terminate(),程序就会遇到未定义的行为。

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

3 个答案:

答案 0 :(得分:6)

标准C ++不提供内置方式。

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

你的意思是这样的:

terminate_handler oldHandler;

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

void onDllUnload()
{
    set_terminate (oldHandler);
}

void newHandler()
{
}