Вот и проблема. Мое приложение вызывает CoCreateInstance()
для создания COM-объекта, реализованного в сторонней DLL. Эта DLL вызывает set_terminate()
, чтобы изменить обработчик terminate()
и передает адрес своего собственного обработчика terminate()
.Как я могу получить текущий обработчик terminate() без его изменения?
Начальный адрес отправителя terminate()
не сохраняется этой библиотекой - ему все равно, и он просто меняет обработчик и никогда не восстанавливает его. Как только DLL выгружается, его код больше не находится в памяти процесса, поэтому, если теперь terminate()
называется программой, она запускается в неопределенное поведение.
Я хотел бы получить и сохранить адрес начального обработчика terminate()
, чтобы иметь возможность его восстановить. Как мне это сделать?
Не могли бы вы упомянуть, что такое DLL, чтобы другие могли быть предупреждены? –
@Rob Kennedy: Это зависит от домена, поэтому шансы на то, что кто-то использует его, и 2. на самом деле пострадают от описанного поведения, незначительны. Плюс мы теперь пытаемся убедить поддержку поставщика, что они должны это исправить. – sharptooth