这是问题所在。我的应用程序调用CoCreateInstance()
来创建在第三方DLL中实现的COM对象。该DLL调用set_terminate()
来更改terminate()
处理程序,并在其中传递其自己的terminate()
处理程序的地址。
该库不保存初始terminate()
处理程序地址-无关紧要,只需更改处理程序就不会恢复它。 DLL卸载后,其代码就不再位于进程内存中,因此,如果现在调用terminate()
,程序将进入未定义的行为。
我想检索并存储初始terminate()
处理程序的地址以能够恢复它。我该怎么做?
最佳答案
标准C++不提供任何内置方式。
当然,您可以只调用一次terminate()两次:第一次使用您拥有的任何虚拟处理程序(然后再存储终止()返回的处理程序);第二个-恢复刚刚存储的处理程序;)简单的技巧。