0

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

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

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

4

3 回答 3

6

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

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

于 2010-02-04T14:23:03.710 回答
2

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

于 2012-01-08T07:49:42.470 回答
1

你的意思是这样的:

terminate_handler oldHandler;

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

void onDllUnload()
{
    set_terminate (oldHandler);
}

void newHandler()
{
}
于 2010-02-04T14:28:25.820 回答