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

Переход на 64-бит: использование EnumWindows с обратным вызовом в Delphi Ответ: Использование динамических массивов как параметров обратных функций в 64-битном Delphi: миф или реальность

Delphi , Синтаксис , Массивы

Переход на 64-бит: использование EnumWindows с обратным вызовом в Delphi

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

Проблема

Разрабатывая 64-битное приложение, разработчик столкнулся с необходимостью изменять код, который ранее использовал TStringList для хранения идентификаторов окон запущенных приложений. В новой версии кода было решено собирать идентификаторы напрямую в числовом формате. В качестве альтернативы TStringList был выбран TList, что позволило успешно решить задачу. Однако, в академических целях был проведен эксперимент с использованием динамических массивов, который не увенчался успехом.

Вопрос

Можно ли использовать динамические массивы в качестве параметров обратных функций, вызываемых через API Windows?

Контекст

Изначально была предпринята попытка использовать динамический массив для сбора идентификаторов окон. Однако, несмотря на различные попытки реализации, достичь успеха не удалось. В документации запретов на использование динамических массивов не обнаружено, но в блоге Rudy V было замечено, что строки и динамические массивы Delphi не должны передаваться в API-функции как типы с подсчетом ссылок.

Решение

После успешной верификации решения с использованием TList, разработчик вернулся к идее использования динамического массива. Оказалось, что проблема заключалась в том, что при изменении динамического массива через SetLength, изменяется и указатель на массив, что приводит к потере доступа к нему из обратной функции. Решением проблемы стало использование указателя на динамический массив.

type
  THandleList = TArray<THandle>;
  PHandleList = ^THandleList;

function FindActiveUSERApps(AHandle: HWND; AList: LPARAM): BOOL; stdcall;
var
  ...
  PList: PHandleList;
begin
  ...
  PList := PHandleList(AList);
  SetLength(PList^, Length(PList^) + 1);
  PList^[High(PList^)] := AHandle;
end;

function GetActiveUSERApps(var AList: THandleList): Boolean;
begin
  SetLength(AList, 0);
  EnumWindows(@FindActiveUSERApps, LPARAM(@AList));
  Result := Length(AList) > 0;
end;

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

Использование var при объявлении параметра в функции GetActiveUSERApps позволило корректно передать динамический массив в обратную функцию.

Заключение

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


Примечание: В статье использованы примеры кода на Object Pascal, что соответствует требованиям основной тематики сайта про Delphi и Pascal.

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

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


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

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




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


:: Главная :: Массивы ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-03-14 12:18:50/0.00154709815979/0