Разработчики, работающие с технологиями Delphi, иногда сталкиваются с различными проблемами, особенно при переходе на 64-битные сборки. Одна из таких проблем связана с использованием функции CreateWindowEx(), которая возвращает значение 0, что указывает на неудачную попытку создания окна. В данной статье мы рассмотрим, как исправить эту ошибку, возникшую в Delphi 11.2 при работе с 64-битными проектами.
Описание проблемы
Функция CreateWindowEx() используется для создания окон в операционной системе Windows. Однако, при работе с Delphi 11.2 в 64-битной конфигурации, разработчики могут столкнуться с проблемой, когда CreateWindowEx() возвращает 0, что не позволяет создать необходимое окно. Это может быть вызвано различными причинами, включая неправильную регистрацию класса окна или ошибки в обработчике сообщений.
Контекст проблемы
Пользователь столкнулся с ошибкой при использовании функции CreateWindowEx() в коде на Object Pascal, который использует библиотеку Cromis.DirectoryMonitoring. Пример кода, в котором возникает проблема:
Ошибка возникает исключительно в 64-битной версии Delphi 11.2.
Альтернативный ответ и подсказки
В контексте обсуждения этой проблемы было предложено проверить, была ли вызвана функция RegisterClass() для регистрации класса окна, поскольку это является необходимым условием для корректной работы CreateWindowEx(). Также было предложено убедиться в отсутствии ошибок в обработчике сообщений WndProc, зарегистрированном для класса окна.
Подтвержденный ответ
Исправление проблемы заключается в корректной декларации обработчика сообщений WndProc для 64-битных сборок. В исходном коде библиотеки Cromis.Utils.pas была обнаружена ошибка в типизации параметров функции WndProc:
function TSClassWndProc(Window: HWND; Message, WParam, LParam: longint): longint; stdcall;
В 64-битных сборках типы WPARAM, LPARAM и LRESULT имеют другой размер, и использование longint может привести к неопределенному поведению. Правильная декларация функции должна выглядеть так:
После внесения этих изменений, функция CreateWindowEx() перестала возвращать 0 и начала успешно создавать окно.
Заключение
При работе с 64-битными сборками в Delphi важно обращать внимание на типы данных, используемые в обработчиках сообщений. Использование функций GetWindowLongPtr и SetWindowLongPtr вместо GetWindowLong и SetWindowLong позволяет избежать необходимости в условной компиляции кода в зависимости от битности сборки.
Следуя этим рекомендациям, разработчики смогут избежать типичных ошибок, связанных с несовместимостью типов данных в 32- и 64-битных приложениях, и обеспечить корректную работу компонентов пользовательского интерфейса.
Разработчики в Delphi столкнулись с проблемой создания окна в 64-битной версии, связанной с неправильной типизацией обработчика сообщений в функции `CreateWindowEx()` в Delphi 11.2.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS