Сторонний код модифицирует управляющее слово FPU

Введение - длинная и скучная часть

(Вопрос в конце)

У меня сильно заболела голова из-за стороннего COM-компонента, который постоянно меняет управляющее слово FPU.

Моя среда разработки - Windows и Visual C ++ 2008. Обычное управляющее слово FPU указывает, что исключения не должны генерироваться при различных условиях. Я проверил это, посмотрев на макрос _CW_DEFAULT , найденный в float.h , а также посмотрев на контрольное слово в отладчике при запуске.

Каждый раз, когда я делаю вызов в COM-объект, при возврате командное слово изменяется. От этого легко защититься. Я просто сбрасываю контрольное слово, и все хорошо. Проблема в том, что компонент COM начинает вызывать мой приемник событий. Я могу защитить свой код, сбросив управляющее слово, как только получу вызов события, но я не могу ничего сделать, как только вернусь из вызова события.

У меня нет источника для этого COM-компонента , но я на связи с автором. Я получил от него ответы: «А?». Я не думаю, что он понимает, о чем я говорю, поэтому боюсь, что мне придется что-то делать с этим сам. Я считаю, что его среда выполнения (я думаю, что это либо Delphi, либо Borland C ++, потому что DLL заполнена именами символов, начинающимися с заглавной буквы T) или какой-либо другой сторонний код, который он использует, вызывает проблему. Я не думаю, что его код явно изменяет управляющее слово FPU.

Итак, что я могу сделать? С точки зрения бизнеса использовать этот сторонний компонент обязательно. С технической точки зрения я мог бы отказаться от этого,и сам реализую протокол связи. Однако это было бы очень дорого, поскольку этот протокол включает обработку транзакций по кредитным картам. Мы не хотим брать на себя ответственность.

Мне отчаянно нужна помощь или некоторая полезная информация о настройках FPU в продуктах Borland, которую я могу передать автору компонента.

Вопросы

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

Я раздумывал над идеей установки собственного обработчика исключений, в котором я просто сбрасываю контрольное слово в обработчике и скажите Windows продолжить выполнение. Я попытался установить обработчик с помощью SetUnhandledExceptionFilter () , но по какой-то причине исключения не перехватываются.

  1. Почему я не перехватываю исключения?
  2. Если мне удается перехватить исключения FPU, сбросить контрольное слово FPU и просто позволить продолжению выполнения, поскольку ничего не произошло - все ставки сняты?

Обновление

Я хотел бы поблагодарить всех за их предложения. Я отправил автору инструкции о том, что он может сделать, чтобы облегчить жизнь не только мне, но и многим другим клиентам его кода. Я посоветовал ему выбрать контрольное слово FPU в DllMain (DLL_PROCESS_ATTACH) и сохранить контрольное слово на потом, чтобы он мог сбросить FPU CW перед вызовом моих обработчиков событий и возвращением из моих вызовов .

А пока у меня есть взлом, если кому-то интересно. Взлом потенциально плохой, потому что я не знаю, что он сделает с его кодом . Ранее я получил подтверждение, что он не использует числа с плавающей запятой в своем коде, поэтому это должно быть безопасно, за исключением некоторого стороннего кода, который он использует, который полагается на исключения FPU.

Две модификации, которые я внес в свое приложение:

  1. Оберните мой насос сообщений
  2. Установите обработчик окна ( WH_CALLWNDPROC ), чтобы отлавливать угловые случаи, когда насос сообщений обходится

В обоих случаях я проверяю, изменился ли FPU CW. Если это так, я сбрасываю его на _CW_DEFAULT .

10
задан Jörgen Sigvardsson 4 August 2011 в 08:07
поделиться