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

### Изменения в Delphi 11.3: Почему SHGetFileInfo Вызывает ERangeError и Как Это Исправить

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

Изменения в Delphi 11.3: Почему SHGetFileInfo Вызывает ERangeError и Как Это Исправить

В последних версиях 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




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


:: Главная :: Справочник по API-функциям ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 14:19:56/0.0032370090484619/0