При обновлении среды разработки с 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