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

### Устранение Ошибки Диапазона Значений при Работе с 64-Битными Приложениями в Delphi Alexandria 11.2

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

Устранение Ошибки Диапазона Значений при Работе с 64-Битными Приложениями в Delphi Alexandria 11.2

При обновлении среды разработки с Delphi Berlin до Delphi Alexandria 11.2 пользователи могут столкнуться с проблемой, когда при работе с 64-битными приложениями возникает ошибка диапазона значений (range check error). Это происходит при попытке подключения к сервисам Windows, и проблема не наблюдается при компиляции под 32-битную платформу, а также в предыдущей версии Delphi Berlin/64-bit.

Проблема заключается в том, что функция OpenSCManager, используемая для управления сервисами Windows, возвращает указатель на тип SC_HANDLE, который в Delphi представлен как THandle. В 32-битных приложениях этот указатель занимает 4 байта, а в 64-битных — 8 байт. При попытке сохранить результат работы OpenSCManager в переменную типа Integer (32 бита) возникает ошибка, так как 64-битный указатель не помещается в 32-битное целое число.

Пример кода, вызывающего ошибку:

function TForm1.ConnectToServices(const AServiceName: String; const AMachineName: String): Integer;
begin
  Result := -1;
  try
    if AMachineName = '' then
      // Ошибка возникает здесь
      Result := OpenSCManager(nil, nil, SC_MANAGER_CONNECT)
    else
      // и здесь
      Result := OpenSCManager(PChar(AMachineName), nil, SC_MANAGER_CONNECT);
  except
    // Получение последней ошибки возвращает 0, но игнорирование вышеуказанной ошибки приводит к проблемам в дальнейшем
    ShowMessage(SysErrorMessage(GetLastError));
  end;
end;

Решение проблемы:

Для устранения ошибки необходимо изменить тип возвращаемого значения функции TForm1.ConnectToServices на THandle или NativeInt, который соответствует 64-битному типу. Это позволит корректно работать с указателями, возвращаемыми функцией OpenSCManager.

Исправленный код:

function TForm1.ConnectToServices(const AServiceName: String; const AMachineName: String): THandle;
begin
  Result := THandle(-1);
  try
    if AMachineName = '' then
      Result := OpenSCManager(nil, nil, SC_MANAGER_CONNECT)
    else
      Result := OpenSCManager(PChar(AMachineName), nil, SC_MANAGER_CONNECT);
  except
    ShowMessage(SysErrorMessage(GetLastError));
  end;
end;

Важные замечания:

  • Delphi 11.2 добавил поддержку высокоэнтропийного аллокатора памяти, что увеличивает вероятность возникновения ошибок, связанных с несоответствием типов.
  • Убедитесь, что все места в вашем приложении, где используются указатели, соответствующим образом изменены на 64-битные типы.

Следуя этим рекомендациям, вы сможете устранить ошибку диапазона значений в 64-битных приложениях, созданных с использованием Delphi Alexandria 11.2.

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

Описание контекста: При обновлении Delphi с версии Berlin на Alexandria 11.2 может возникнуть ошибка диапазона значений в 64-битных приложениях при работе с указателями, возвращаемыми функциями для управления сервисами Windows, что требует изменения типо


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

Получайте свежие новости и обновления по 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 14:01:25/0.0032989978790283/0