64Битная разработка с Delphi XE2 Devart Blog

64-битная разработка с Delphi XE2.

Обзор Delphi XE2.

Delphi XE2 — это крупный прорыв в линейке всех версий Delphi этого продукта. Он позволяет развертывать ваши приложения как на платформах Windows, так и на Mac OS. Кроме того, теперь можно создавать 64-разрядные приложения Windows, чтобы в полной мере использовать возможности нового оборудования. Более того, вы можете создавать визуально впечатляющие приложения с помощью платформы приложений FireMonkey GPU..

Его основные особенности следующие:

Поддержка 64-битной платформы Windows; Поддержка Mac OS; Платформа разработки приложений FireMonkey; Связывание данных в реальном времени с визуальными компонентами; Стили VCL для приложений Windows.

Дополнительные сведения о Delphi XE2 см. В статье Обзор Delphi XE2 на веб-сайте Embarcadero..

Изменения в разработке 64-битных приложений.

Поддержка 64-битной платформы подразумевает несколько важных изменений, которые каждый разработчик должен учитывать перед разработкой нового приложения или модернизацией старого..

Общий.

Delphi XE2 IDE — это 32-битное приложение. Это означает, что он не может загружать 64-битные пакеты во время разработки. Итак, все пакеты времени разработки в Delphi XE2 IDE 32-разрядные..

Поэтому, если вы разрабатываете свои собственные компоненты, вы должны помнить, что для целей разработки компонентов с поддержкой 64-битной платформы вам необходимо компилировать пакеты времени выполнения как для 32-, так и для 64-битных платформ, а во время разработки пакеты нужно компилировать только для 32-битной платформы. Это может быть источником трудностей, если ваш пакет одновременно является пакетом времени выполнения и пакетом времени разработки, поскольку более чем вероятно, что этот пакет не будет скомпилирован для 64-битной платформы. В этом случае вам придется разделить свой пакет на два пакета, один из которых будет использоваться только во время выполнения, а другой — только во время разработки..

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

Расширенный тип.

Для этого типа в 64-битных приложениях компилятор генерирует инструкции SSE2 вместо FPU, и это значительно улучшает производительность в приложениях, которые часто используют этот тип (где требуется точность данных). Для этого уменьшены размер и точность расширенного типа:

ТИП 32-разрядный 64-разрядный Расширенный 10 байтов 8 байтов.

Следующие два дополнительных типа введены для обеспечения совместимости в процессе разработки 32- и 64-битных приложений:

Extended80 — размер которого в 32-битном приложении составляет 10 байт; однако этот тип обеспечивает ту же точность, что и его 8-байтовый эквивалент в 64-битных приложениях..

Extended80Rec — может использоваться для выполнения низкоуровневых операций над значением с плавающей запятой повышенной точности. Например, можно отдельно изменить знак, показатель степени и мантиссу. Он позволяет выполнять операции, связанные с памятью, с 10-разрядными переменными с плавающей запятой, но не арифметические операции повышенной точности..

Указатель и целые числа.

Основное различие между 32- и 64-битными платформами — это объем используемой памяти и, соответственно, размер указателя, который используется для адресации больших объемов памяти..

ТИП 32-бит 64-битный указатель 4 байта 8 байтов.

При этом размер типа Integer остается одинаковым для обеих платформ:

ТИП 32-бит 64-битное целое 4 байта 4 байта.

Поэтому на 64-битной платформе некорректно работает следующий код:

Хотя этот код корректно работает на 64-битной платформе и некорректно на 32-битной платформе:

Для этого вводится следующий платформо-зависимый целочисленный тип:

ТИП 32-разрядный 64-разрядный NativeInt 4 байта 8 байтов NativeUInt 4 байта 8 байтов.

Этот тип помогает гарантировать правильную работу указателей как на 32-, так и на 64-битных платформах:

Однако при разработке приложений для нескольких версий Delphi необходимо проявлять особую осторожность, и в этом случае следует помнить, что в предыдущих версиях Delphi тип NativeInt имел разные размеры:

ТИП Версия Delphi Размер NativeInt D5 Н / Д NativeInt D6 Н / Д NativeInt D7 8 байтов NativeInt D2005 8 байтов NativeInt D2006 8 байтов NativeInt D2007 8 байтов NativeInt D2009 4 байта NativeInt D2010 4 байта NativeInt Delphi Native XE 4 байта XEnt 4 байта.

Выходные параметры.

Некоторые функции WinAPI имеют параметры OUT типа SIZE_T, что эквивалентно NativeInt в Delphi XE2. Проблема в том, что если вы разрабатываете только 32-битное приложение, вы не сможете передать Integer в OUT, тогда как в 64-битном приложении вы не сможете передать Int64; в обоих случаях вы должны пройти NativeInt.

Если вы передаете указатели в SendMessage / PostMessage / TControl.Perform, параметры wParam и lParam должны быть преобразованы в тип WPARAM / LPARAM, а не в Integer / Longint..

Замените SetWindowLong / GetWindowLog на SetWindowLongPtr / GetWindowLongPtr для GWLP_HINSTANCE, GWLP_ID, GWLP_USERDATA, GWLP_HWNDPARENT и GWLP_WNDPROC, поскольку они возвращают указатели и дескрипторы. Указатели, которые передаются в SetWindowLongPtr, должны приводиться к типу LONG_PTR, а не к Integer / Longint..

Указатели, назначенные полю TMessage.Result, должны использовать приведение типа к LRESULT вместо Integer / Longint..

Ассемблер.

Чтобы ваше приложение (использующее ассемблерный код) работало, вам нужно будет внести в него несколько изменений:

перепишите свой код, который смешивает код Pascal и код сборки. Их смешивание не поддерживается в 64-битных приложениях; переписать ассемблерный код, не учитывающий особенности архитектуры и процессора.

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

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

Обработка исключений.

Самая большая разница в обработке исключений между 32-разрядной и 64-разрядной версиями Delphi заключается в том, что в 64-разрядной версии Delphi XE2 вы получите большую производительность из-за другого внутреннего механизма исключения. Для 32-битных приложений компилятор Delphi (dcc32.exe) генерирует дополнительный код, который выполняется любым способом и приводит к потере производительности. 64-битный компилятор (dcc64.exe) не генерирует такой код, он вместо этого генерирует метаданные и сохраняет их в разделе PDATA исполняемого файла..

Но в 64-битной версии Delphi XE2 невозможно иметь более 16 уровней вложенных исключений. Наличие более 16 уровней вложенных исключений вызовет ошибку времени выполнения.

Отладка.

Отладка 64-битных приложений в Delphi XE2 удаленная. Это вызвано той же причиной: Delphi XE2 IDE — это 32-разрядное приложение, а ваше приложение — 64-разрядное. Если вы пытаетесь отладить свое приложение и не можете этого сделать, вам следует убедиться, что включена опция «Включить удаленные символы отладки»..

Чтобы включить его, выполните следующие действия:

Откройте Project Options (в главном меню Project->Опции ). В поле со списком «Цель» выберите «Конфигурация отладки — 64-разрядная платформа Windows». .

Если в поле со списком нет такой опции, щелкните правой кнопкой мыши Целевые платформы в Диспетчере проектов и выберите Добавить платформу. После добавления 64-битной платформы Windows в выпадающем списке Target будет доступен параметр Конфигурация отладки — 64-битная платформа Windows..

Выберите «Связывание» в левой части формы «Параметры проекта». Включите параметр Включить символы удаленной отладки.

После этого вы можете запускать и отлаживать свое 64-битное приложение..

Чтобы включить удаленную отладку, выполните следующие действия:

Установите Platform Assistant Server (PAServer) на удаленный компьютер. Вы можете найти PAServer в каталоге% RAD_Studio_XE2_Install_Directory% PAServer. Файл setup_paserver.exe — это установочный файл для Windows, а файл setup_paserver.zip — установочный файл для MacOS. Запустите файл PAServer.exe на удаленном компьютере и установите пароль, который будет использоваться для подключения к этому компьютеру. На локальном компьютере с установленным Delphi XE2 щелкните правой кнопкой мыши целевую платформу, которую вы хотите отлаживать в Диспетчере проектов, и выберите «Назначить удаленный профиль». Нажмите кнопку «Добавить» в открывшемся окне и введите имя своего профиля. Нажмите кнопку «Далее», введите имя удаленного компьютера и пароль для него (который вы назначили при запуске PAServer на удаленном компьютере). После этого вы можете проверить соединение, нажав кнопку «Проверить соединение». Если ваше соединение не удалось, убедитесь, что ваши брандмауэры на удаленном и локальном компьютерах не блокируют ваше соединение, и попробуйте установить соединение еще раз. Если подключение прошло успешно, нажмите кнопку «Далее», а затем — кнопку «Готово». Выберите свой недавно созданный профиль и нажмите ОК..

После выполнения этих действий вы сможете отлаживать свое приложение на удаленном компьютере. Ваше приложение будет запущено на удаленном компьютере, но вы сможете отлаживать его на локальном компьютере с помощью Delphi XE2..

Дополнительные сведения о работе с Platform Assistant Server см. В этой статье. .

Аспекты 64-битной разработки, специфичные для баз данных.

Для каждой базы данных специфика 64-битной разработки в основном обусловлена ​​использованием конкретных клиентских библиотек базы данных. Когда наши решения для подключения используются в режиме Direct (без использования клиентского ПО базы данных), специфика разработки приложений зависит исключительно от особенностей 64-битной платформы независимо от используемой базы данных..

Например, наши решения для подключения к PostgreSQL (PgDAC, UniDAC и драйвер dbExpress для PostgreSQL) работают напрямую с базой данных PostgreSQL. Наши решения для подключения к Oracle и MySQL могут использоваться в прямом режиме, а также с соответствующим клиентом базы данных..

Для наших решений по подключению, использующих клиентские библиотеки СУБД, должны быть выполнены следующие требования. Поскольку Delphi XE2 — 32-битное приложение, оно может загружать только 32-битные библиотеки. Итак, для подключения к базе данных во время разработки вам необходимо использовать 32-битную клиентскую библиотеку, а во время выполнения вам понадобится 64-битная клиентская библиотека. Для SQL Server, InterBase и Firebird, MySQL (в клиентском режиме) и SQLite вам необходимо поместить 32-битную клиентскую библиотеку в каталог C: WindowsSysWOW64 (если вам нужно подключиться к базе данных во время разработки), а 64-битная клиентская библиотека, используемая для подключения к базе данных во время выполнения, в каталог C: WindowsSystem32. Обратите внимание, что разработчики SQLite не предоставляют готового драйвера для платформ x64, а для приложений x64 нужно вручную скомпилировать библиотеку sqlite (например, в MS VisualStudio).

Наши решения для подключения к Oracle (ODAC, UniDAC, драйвер dbExpress для Oracle) используют клиент Oracle по умолчанию в качестве стандарта, поэтому в зависимости от емкости клиента Oracle по умолчанию вам необходимо явно указать либо 64-разрядный клиент для времени выполнения (если клиент Oracle DEFAULT 32-разрядный), или 32-разрядный клиент для времени разработки (если клиент Oracle DEFAULT 64-разрядный), или вы можете явно указать обоих клиентов — для времени выполнения и для времени разработки.

При разработке кроссплатформенного приложения с использованием UniDAC для работы с базой данных MS Access следует помнить, что невозможно установить два (32- и 64-битных) драйвера в одной системе (ограничение Microsoft). Вот почему, если вам нужно подключиться к базе данных во время разработки, 32-разрядный драйвер должен быть установлен на компьютере разработчика, поскольку Delphi XE2 использует библиотеки x32 во время разработки. Если такое подключение не требуется, вы можете установить драйвер x64 MS Access. Все остальные аспекты разработки x64 и x32 идентичны.

Что касается использования UniDAC для подключения к другим серверам баз данных через ODBC, за информацией о драйверах для различных платформ и особенностями обращайтесь к их разработчикам..

Похожие статьи