Пользователь столкнулся с проблемой, связанной с использованием API для работы с DPI-осведомленностью в Delphi. В частности, ему необходимо было использовать константы, определенные в заголовочном файле windef.h, который не входит в стандартную поставку Delphi. Проблема заключалась в том, что константы, используемые в API, имеют тип DECLARE_HANDLE, который в C/C++ является псевдонимом для указателя. В Delphi же нет аналога такой конструкции, и пользователю необходимо было найти способ адаптации этих констант для использования в Delphi-проектах.
Описание проблемы
Вопрос заключался в необходимости использования констант DECLARE_HANDLE из windef.h в Delphi для работы с API, связанным с DPI-осведомленностью. Пример кода, который необходимо было адаптировать:
Пользователь выяснил, что при использовании функции GetThreadDpiAwarenessContext значения этих констант в виде NativeUInt соответствуют 16, 17 и 18 соответственно. Однако он хотел убедиться в будущей устойчивости этих значений и не смог найти способ воспроизвести конструкцию заголовка в Delphi, которая давала бы такие же результаты, кроме явного объявления целочисленных констант.
Подтвержденный ответ
Для использования в функции SetThreadDpiAwarenessContext необходимо объявить константы следующим образом:
type
DPI_AWARENESS_CONTEXT = type THandle;
const
DPI_AWARENESS_CONTEXT_UNAWARE = DPI_AWARENESS_CONTEXT(-1);
DPI_AWARENESS_CONTEXT_SYSTEM_AWARE = DPI_AWARENESS_CONTEXT(-2);
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = DPI_AWARENESS_CONTEXT(-3);
При этом, получая значение от GetThreadDpiAwarenessContext, следует использовать функцию GetAwarenessFromDpiAwarenessContext и сравнивать результат с перечислением DPI_AWARENESS, так как тип DPI_AWARENESS_CONTEXT содержит дополнительную информацию, и Microsoft может изменить его в будущем.
Альтернативный ответ
Delphi не использует C/C++ заголовочные файлы, поэтому отсутствие их в поставке IDE не является проблемой. Однако, если пользователь беспокоится о том, что Delphi не предоставляет переводов Pascal для C заголовочных файлов, это другой вопрос.
В C/C++ макрос DECLARE_HANDLE объявляет новый тип данных, который является псевдонимом для void * или PVOID, в зависимости от определения STRICT. Это обеспечивает большую типовую безопасность, предотвращая смешивание различных типов обработчиков.
В Delphi аналогом DECLARE_HANDLE может служить прямое объявление типа DPI_AWARENESS_CONTEXT как THandle или как указатель. Пример такого объявления:
Это позволяет использовать константы в функциях, требующих тип DPI_AWARENESS_CONTEXT, но для получения значений из GetThreadDpiAwarenessContext необходимо использовать дополнительные функции, так как возвращаемые значения содержат дополнительную информацию и не совпадают напрямую с определенными константами.
Заключение
Для интеграции констант, определенных в windef.h, в проекты на Delphi, необходимо адаптировать их под синтаксис Object Pascal. Объявление типа DPI_AWARENESS_CONTEXT как THandle и последующее определение констант позволяет использовать их в функциях, требующих такого типа данных. Однако, при работе с API, возвращающим значения, необходимо использовать дополнительные функции для их интерпретации, так как типы данных в C/C++ и Delphi имеют свои особенности и не всегда напрямую совместимы.
Пользователь сталкивается с необходимостью адаптации констант `DECLARE_HANDLE` из C/C++ заголовочного файла windef.h для использования в программировании на Delphi для работы с DPI-осведомленным API.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.