Как я могу получить текущий обработчик terminate (), не меняя его? - PullRequest
0 голосов
/ 04 февраля 2010

Вот проблема. Мое приложение вызывает CoCreateInstance() для создания COM-объекта, реализованного в сторонней DLL. Эта DLL вызывает set_terminate() для изменения обработчика terminate() и передает туда свой собственный обработчик terminate().

Исходный адрес обработчика terminate() не сохраняется этой библиотекой - он не заботится и просто меняет обработчик и никогда не восстанавливает его. Как только DLL выгружается, ее код больше не находится в памяти процесса, поэтому, если теперь вызывается terminate(), программа запускает неопределенное поведение.

Я бы хотел получить и сохранить адрес исходного обработчика terminate(), чтобы иметь возможность его восстановить. Как я могу это сделать?

Ответы [ 3 ]

6 голосов
/ 04 февраля 2010

Стандарт C ++ не предоставляет встроенного способа.

Конечно, вы могли бы просто вызвать terminate () дважды : в первый раз, используя какой-либо фиктивный обработчик, который у вас есть (и затем сохранить обработчик, который возвращает вам); второе - восстановить обработчик, который вы только что сохранили;) Простой трюк.

2 голосов
/ 08 января 2012

В C ++ 11 вы вызываете std :: get_terminate.

1 голос
/ 04 февраля 2010

Вы имеете в виду что-то вроде этого:

terminate_handler oldHandler;

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

void onDllUnload()
{
    set_terminate (oldHandler);
}

void newHandler()
{
}
...