Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

### Как исправить ошибку доступа к памяти в Delphi 11.2 при отображении всплывающих окон на Win64?

Delphi , Компоненты и Классы , Потоки

Как исправить ошибку доступа к памяти в Delphi 11.2 при отображении всплывающих окон на Win64?

При обновлении среды разработки Delphi до версии 11.2 пользователи могут столкнуться с рядом проблем, в том числе и с ошибками доступа к памяти при работе с 64-битными платформами. Одной из таких проблем является сбой при вызове функции CreateWindowEx в компоненте PBThreadedSplashForm, предназначенном для отображения всплывающего окна во время старта приложения. В этой статье мы рассмотрим причины возникновения такой ошибки и предложим способы её исправления.

Причины возникновения ошибки

Ошибка доступа к памяти (AV, от англ. Access Violation) может возникать из-за некорректного использования указателей в коде. В 32-битных приложениях указатели имеют ширину 32 бита, в то время как в 64-битных приложениях — 64 бита. Если в коде используется тип данных Integer для хранения указателей, то в 64-битных приложениях это может привести к обрезанию верхних бит указателя и, как следствие, к ошибкам.

С выпуском Delphi 11.2, где была включена поддержка Address Space Layout Randomization (ASLR), вероятность случайного совпадения значений указателей снизилась, что увеличивает шансы выявления таких ошибок.

Исправление ошибки

Для исправления ошибки необходимо убедиться, что в коде не используется хранение указателей в переменных типа Integer. Вместо этого следует использовать переменные типа NativeInt, Pointer или другие типы, соответствующие размеру указателя.

Также рекомендуется заменить вызовы функций (Get|Set)WindowLong на (Get|Set)WindowLongPtr, что обеспечит корректное обращение к параметрам окна в 64-битных приложениях.

Пример кода

В коде PBThreadedSplashForm найдите и замените следующие строки:

SetWindowLong( wnd, GWL_WNDPROC, Integer( thread.FCallstub ));
Integer( PChar( FStatusMessage ))
Integer( PChar( msg ))

На:

SetWindowLongPtr( wnd, GWLP_WNDPROC, NativeInt( thread.FCallstub ));
NativeInt( PChar( FStatusMessage ))
NativeInt( PChar( msg ))

Заключение

Исправление ошибки доступа к памяти в Delphi 11.2 при работе с 64-битными платформами требует внимательного пересмотра кода и корректировки типов данных, используемых для хранения указателей. Следуя этим рекомендациям, вы сможете устранить проблему и обеспечить стабильную работу вашего приложения на различных платформах.

Обратите внимание, что отключение ASLR не является правильным решением, так как это лишь маскирует проблему, не устраняя её.

Создано по материалам из источника по ссылке.

Описание контекста: В контексте рассматривается проблема ошибки доступа к памяти в Delphi 11.2 при отображении всплывающих окон на 64-битных системах, связанная с некорректным использованием указателей и типом данных для их хранения.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Потоки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 14:44:02/0.0035610198974609/0