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

**Ошибки и их решения при переносе проектов на Delphi 10 Seattle: обновление типов Win32 API**

Delphi , Синтаксис , Справочник по API-функциям

Изменения в Delphi 10 Seattle и их влияние на Win32 GetPath, а также избыточность записей TPoint и _POINTL

В процессе переноса проекта с Delphi XE8 на Delphi 10 Seattle разработчики могут столкнуться с изменениями в сигнатуре функций WinAPI. Одним из таких изменений является функция GetPath из модуля Winapi.Windows, которая теперь требует использование типа PPointL вместо ранее используемого "var untyped" параметра.

Проблема

При переносе кода, использующего функцию GetPath, в Delphi 10 Seattle, возникает необходимость приведения типов в приложении к тем, которые объявлены в модуле Winapi.Windows. В частности, в коде могут использоваться типы TPoint и _POINTL, которые, на первый взгляд, кажутся идентичными, но имеют разные определения в разных модулях.

Контекст

В Delphi 10 Seattle функция GetPath принимает параметры следующего вида:

function GetPath(DC: HDC; Points: PPointL; Types: PByte; nSize: Integer): Integer; stdcall;

В предыдущей версии Delphi XE8, параметры Points и Types были объявлены как "var untyped". В модуле Winapi.Windows определены следующие типы:

type
  _POINTL = record
    x: Longint;
    y: Longint;
  end;
  {$EXTERNALSYM _POINTL}
  PPointL = ^TPointL;
  TPointL = _POINTL;

Также в модуле System.Types определен тип TPoint:

TPoint = record
  X: FixedInt;
  Y: FixedInt;
end;

И хотя FixedInt алиасирован как Longint для обеих версий Windows (32 и 64 бит), типы TPoint и _POINTL кажутся избыточными и могут вводить в заблуждение при переносе кода.

Подход к решению

Рассмотрим несколько вариантов решения проблемы:

  1. Использование алиаса: Можно попытаться алиасить TPoint в _POINTL на уровне модуля, где используется TPoint.

  2. Переопределение функции: В качестве временного решения можно переопределить функцию GetPath в собственном модуле, оставив параметры Points и Types как "var untyped".

  3. Создание отчета об ошибке: Если изменения в Delphi 10 Seattle кажутся неправильными, можно создать отчет об ошибке (QP report) и запросить исправление.

  4. Использование приведения типов: Поскольку TPoint и _POINTL бинарно совместимы, можно использовать приведение типов для передачи PPoint вместо PPointL.

Подтвержденный ответ

В сообщениях пользователей и обсуждениях на форумах упоминается, что изменение в Delphi 10 Seattle, касающееся функции GetPath, является неправильным. Тип TPointL уже существовал ранее, но он не предназначен для использования с GetPath. В Win32 API функция GetPath принимает параметры типа LPPOINT, что соответствует TPoint. В некоторых случаях Win32 API использует POINTL, но большинство функций работают с POINT. В Delphi 10 Seattle разработчики по ошибке использовали POINTL вместо POINT для GetPath.

Альтернативный ответ

Пользователь описывает аналогичную проблему и предлагает временное решение в виде переопределения функции GetPath с параметрами var Points, Types в собственном модуле.

Рекомендация

Исходя из обсуждений, рекомендуется создать отчет об ошибке и обратить внимание разработчиков на необходимость изменения типа параметра Points с PPointL на PPoint. В качестве временного решения можно использовать приведение типов для совместимости.

Обновление

В Delphi 10.1 Berlin проблема была исправлена, что подтверждается ссылкой на отчет об ошибке.


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

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

Контекст: В процессе обновления разработчиков в Delphi от версии XE8 до версии 10 Seattle встала проблема с изменениями в типах данных и функциях WinAPI, в частности с функцией `GetPath`, что потребовало адаптации кода к новой версии среды разработки.


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

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




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


:: Главная :: Справочник по API-функциям ::


реклама


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

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