Delphi XE2, TWebBrowser, деление числа с плавающей точкой на ноль - PullRequest
4 голосов
/ 20 февраля 2012

В Delphi 2010 и Delphi 2007 я использую Set8087CW на WebBrowserBeforeNavigate / WebBrowserDocumentComplete, чтобы предотвратить ошибки FPU внутри ActiveX, чтобы нанести вред моему приложению.

Но почему-то это не работает в Delphi XE2, по крайней мере, когда в 64-битном режиме,

При нажатии на ссылки (любые) я получаю «делить на ноль с плавающей точкой».(Первоначальная загрузка адреса веб-сайта или содержимого в TWebBrowser работает нормально.)

В стеке вызовов это происходит внутри system32 \ D3D10Warp.dll (может быть, используется IE9?) В ответ на TApplication.ProcessMessage (и некоторые другие).??? между ними)

1 Ответ

10 голосов
/ 20 февраля 2012

Вам необходимо замаскировать исключения SSE для 64-разрядных, потому что 64-разрядный код обычно использует SSE для выполнения арифметики с плавающей запятой.

Вызов SetMXCSR для изменения состояния управления SSEБлок.Лично я бы продолжил маскировать исключения 8087, так как 64-битный код может свободно использовать модуль 8087, если он того пожелает.Волшебное значение MXCSR, которое вы хотите использовать при вызове кода веб-браузера, равно $1F80.Это значение Windows по умолчанию для MXCSR.

В качестве альтернативы вы можете вызвать SetSSEExceptionMask и SetFPUExceptionMask, передав exAllArithmeticExceptions, чтобы замаскировать все исключения.Эти удобные методы сделают ваш код более читабельным.

Если вы уверены, что вам нужно маскировать исключения только на 8087 в x86 и SSE в x64, тогда вы можете просто позвонить SetExceptionMask.Это изменит состояние управления 8087 под x86 и изменит состояние управления SSE под x64.

Если бы мне пришлось выбирать между установкой всего состояния управления или использованием вспомогательных методов, чтобы изменить только часть состояния маскирования исключенийЯ бы установил весь контроль состояния.Эти элементы управления ActiveX написаны в предположении, что вы будете использовать инструменты MS и ожидаете определенного состояния элемента управления FP.Я бы дал этим элементам управления точное состояние управления, которое они ожидают, и затем вернул бы их обратно в состояние элемента управления Delphi, когда выполнение вернется из элементов управления.

...