2010-02-04 1 views
0

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

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

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

+0

Не могли бы вы упомянуть, что такое DLL, чтобы другие могли быть предупреждены? –

+0

@Rob Kennedy: Это зависит от домена, поэтому шансы на то, что кто-то использует его, и 2. на самом деле пострадают от описанного поведения, незначительны. Плюс мы теперь пытаемся убедить поддержку поставщика, что они должны это исправить. – sharptooth

ответ

6

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

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

1

Вы имеете в виду Somthing так:

terminate_handler oldHandler; 

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

void onDllUnload() 
{ 
    set_terminate (oldHandler); 
} 

void newHandler() 
{ 
}