这是问题所在。我的应用程序调用{{1}}来创建在第三方DLL中实现的COM对象。该DLL调用CoCreateInstance()
来更改set_terminate()
处理程序,并在那里传递其自己的terminate()
处理程序的地址。
初始terminate()
处理程序地址不会被该库保存 - 它不关心并只是更改处理程序而永远不会恢复它。一旦DLL被卸载,它的代码就不再存在于进程内存中,所以如果现在调用terminate()
,程序就会遇到未定义的行为。
我想检索并存储初始terminate()
处理程序的地址,以便能够恢复它。我该怎么办?
答案 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()
{
}