При работе с компонентом TWebBrowser в среде разработки Delphi XE2 в 64-битном режиме пользователи могут столкнуться с проблемой возникновения ошибки "float divide by zero" при навигации по ссылкам. Эта проблема связана с использованием FPU (Floating Point Unit) и возникновением исключений в процессе выполнения арифметических операций с плавающей точкой.
Причины проблемы
В документации по Set8087CW указано, что в 64-битной системе операции с плавающей точкой выполняются с использованием SSE регистра, а не FPU. Тем не менее, FPU всё ещё присутствует в 64-битной системе, и Set8087CW должен устанавливать значение управляющего слова FPU, как и в 32-битном режиме. Однако, если интернет-обозреватель (например, IE9) использует FPU, то стандартные методы не работают.
Решение проблемы
Для решения проблемы необходимо использовать метод SetMXCSR, который позволяет изменить управляющее состояние SSE. Рекомендуется использовать значение $1F80, которое является стандартным значением для Windows. Альтернативно, можно использовать методы SetSSEExceptionMask и SetFPUExceptionMask, передавая параметр exAllArithmeticExceptions, чтобы замаскировать все исключения. Также можно применить метод SetExceptionMask, который автоматически настроит управление исключениями для FPU в 32-битном режиме и для SSE в 64-битном.
Пример кода
uses
System.SysUtils,
System.Math;
procedure TForm1.FormCreate(Sender: TObject);
begin
if (TPlatformServices.Current.SupportsPlatformFeature(PlatformFeature.x64OS)) then
SetMXCSR($1F80);
end;
Рекомендации по использованию
Если вы уверены, что нужно маскировать исключения только для FPU в 32-битном режиме и для SSE в 64-битном, то достаточно вызвать метод SetExceptionMask. Это позволит управлять состоянием FPU и SSE в зависимости от режима выполнения.
При работе с ActiveX-контролами, написанными для использования определенного состояния FPU, рекомендуется устанавливать это состояние при вызове контрола и возвращать в исходное состояние при возврате из контрола.
Заключение
Использование методов SetMXCSR, SetSSEExceptionMask, SetFPUExceptionMask и SetExceptionMask позволяет успешно устранить ошибку "float divide by zero" в TWebBrowser Delphi XE2 при работе в 64-битном режиме. Эти методы обеспечивают корректное управление исключениями при выполнении арифметических операций с плавающей точкой.
Устранение ошибки 'float divide by zero' в компоненте TWebBrowser при работе в Delphi XE2 в 64-битном режиме путем корректного управления исключениями FPU и SSE.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.