В последних версиях Delphi, в частности в версии 11.3, разработчики столкнулись с проблемой, когда функция SHGetFileInfo, используемая для получения списка системных икон, вызывала исключение ERangeError. Это произошло после обновления с Delphi 10.4, где такая проблема отсутствовала. Давайте разберемся, в чем заключается проблема и как ее можно исправить.
Пример кода, вызывающего проблему:
FileIcons: TImageList;
procedure LoadFileIcons;
var
listHandle: Integer;
shFileInfo: TSHFileInfo;
begin
listHandle:= SHGetFileInfo('', 0, shFileInfo, SizeOf(shFileInfo),
SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
if (listHandle <> 0) then
begin
FileIcons.Handle:= listHandle;
FileIcons.ShareImages:= True;
end;
end;
Описание проблемы:
При использовании кода на Delphi 11.3, функция SHGetFileInfo вызывает исключение ERangeError, что указывает на ошибку в области допустимых значений. Это происходит из-за несоответствия типов данных, используемых в вызове функции.
Подтвержденный ответ:
Проблема заключается в том, что тип возвращаемого значения SHGetFileInfo не соответствует типу Integer, который был использован для переменной listHandle. В документации Windows указано, что функция возвращает тип DWORD_PTR. Соответственно, переменная listHandle должна быть определена как Cardinal, что является псевдонимом для DWORD.
Альтернативный ответ:
После того как был замечен совет использовать тип NativeUInt, проблема была решена. Это подтверждает, что использование правильного типа данных является ключевым моментом в решении этой задачи.
Рекомендация:
Всегда важно проверять документацию API и использовать правильные типы данных, соответствующие возвращаемым значениям функций. Это предотвращает возникновение подобных ошибок.
Как исправить:
procedure LoadFileIcons;
var
listHandle: Cardinal;
shFileInfo: TSHFileInfo;
begin
listHandle:= SHGetFileInfo('', 0, shFileInfo, SizeOf(shFileInfo),
SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
if (listHandle <> 0) then
begin
FileIcons.Handle:= listHandle;
FileIcons.ShareImages:= True;
end;
end;
Выводы:
Внимательно изучайте документацию API.
Используйте правильные типы данных для переменных, соответствующие типу возвращаемого значения функций.
В случае с SHGetFileInfo тип listHandle должен быть Cardinal или NativeUInt для корректной работы.
Следуя этим рекомендациям, вы сможете избежать возникновения ошибки ERangeError при использовании SHGetFileInfo в Delphi 11.3.
Обновление Delphi 11.3 привело к ошибке `ERangeError` при использовании функции `SHGetFileInfo` из-за несоответствия типов данных, что требует коррекции типов переменных для исправления проблемы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.