(Вопрос в конце)
У меня сильно заболела голова из-за стороннего COM-компонента, который постоянно меняет управляющее слово FPU.
Моя среда разработки - Windows и Visual C ++ 2008. Обычное управляющее слово FPU указывает, что исключения не должны генерироваться при различных условиях. Я проверил это, посмотрев на макрос _CW_DEFAULT
, найденный в float.h
, а также посмотрев на контрольное слово в отладчике при запуске.
Каждый раз, когда я делаю вызов в COM-объект, при возврате командное слово изменяется. От этого легко защититься. Я просто сбрасываю контрольное слово, и все хорошо. Проблема в том, что компонент COM начинает вызывать мой приемник событий. Я могу защитить свой код, сбросив управляющее слово, как только получу вызов события, но я не могу ничего сделать, как только вернусь из вызова события.
У меня нет источника для этого COM-компонента , но я на связи с автором. Я получил от него ответы: «А?». Я не думаю, что он понимает, о чем я говорю, поэтому боюсь, что мне придется что-то делать с этим сам. Я считаю, что его среда выполнения (я думаю, что это либо Delphi, либо Borland C ++, потому что DLL заполнена именами символов, начинающимися с заглавной буквы T) или какой-либо другой сторонний код, который он использует, вызывает проблему. Я не думаю, что его код явно изменяет управляющее слово FPU.
Итак, что я могу сделать? С точки зрения бизнеса использовать этот сторонний компонент обязательно. С технической точки зрения я мог бы отказаться от этого,и сам реализую протокол связи. Однако это было бы очень дорого, поскольку этот протокол включает обработку транзакций по кредитным картам. Мы не хотим брать на себя ответственность.
Мне отчаянно нужна помощь или некоторая полезная информация о настройках FPU в продуктах Borland, которую я могу передать автору компонента.
Могу ли я что-нибудь сделать? Я не думаю, что у автора компонента есть все необходимое, чтобы исправить это (судя по его довольно невежественным ответам).
Я раздумывал над идеей установки собственного обработчика исключений, в котором я просто сбрасываю контрольное слово в обработчике и скажите Windows продолжить выполнение. Я попытался установить обработчик с помощью SetUnhandledExceptionFilter ()
, но по какой-то причине исключения не перехватываются.
Я хотел бы поблагодарить всех за их предложения. Я отправил автору инструкции о том, что он может сделать, чтобы облегчить жизнь не только мне, но и многим другим клиентам его кода. Я посоветовал ему выбрать контрольное слово FPU в DllMain (DLL_PROCESS_ATTACH)
и сохранить контрольное слово на потом, чтобы он мог сбросить FPU CW перед вызовом моих обработчиков событий и возвращением из моих вызовов .
А пока у меня есть взлом, если кому-то интересно. Взлом потенциально плохой, потому что я не знаю, что он сделает с его кодом . Ранее я получил подтверждение, что он не использует числа с плавающей запятой в своем коде, поэтому это должно быть безопасно, за исключением некоторого стороннего кода, который он использует, который полагается на исключения FPU.
Две модификации, которые я внес в свое приложение:
WH_CALLWNDPROC
), чтобы отлавливать угловые случаи, когда насос сообщений обходится В обоих случаях я проверяю, изменился ли FPU CW. Если это так, я сбрасываю его на _CW_DEFAULT
.