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

### Ошибки в Delphi 10.4: Исправление проблемы с функцией `StrFormatByteSize64`

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

Ошибки в Delphi 10.4: Исправление проблемы с функцией StrFormatByteSize64

Разработчики, работающие с Delphi, время от времени сталкиваются с различными ошибками, в том числе и с теми, что связаны с использованием внешних библиотек Windows API. Одной из таких проблем является ошибка при использовании функции StrFormatByteSize64 в Delphi 10.4. В данной статье мы рассмотрим, как правильно работать с этой функцией, чтобы избежать возникновения runtime ошибки.

Описание проблемы

При попытке использовать функцию Winapi.ShLwApi.StrFormatByteSize64 для преобразования значения размера файла типа Int64 в отформатированную строку, в Delphi 10.4 возникает runtime ошибка. Ошибка связана с не найденным точкой входа в DLL, что указывает на проблему с импортом функции.

var
  ThisSize: Int64;
  pszBuf: PWideChar;
  cchBuf: Cardinal;
begin
  ThisSize := ...; // Значение размера файла
  SetLength(pszBuf, 256); // Выделение памяти для строки
  cchBuf := Length(pszBuf);
  Winapi.ShLwApi.StrFormatByteSize64(ThisSize, pszBuf, cchBuf);
  // Дополнительный код
end;

Ошибка проявляется следующим сообщением:

----------------------------
MyApp.exe - Entry point not found
----------------------------
The Procedure Entry point "StrFormatByteSize64W" was not found in the DLL "C:\\DELPHI\\MyApp\\Win32\\Debug\\MyApp.exe".
----------------------------
OK

Причины и решения

Официальная документация

Согласно документации функции StrFormatByteSize64 (https://learn.microsoft.com/en-us/windows/win32/api/shlwapi/nf-shlwapi-strformatbytesize64a), функция может использоваться для работы как с ANSI, так и с Unicode символами. Однако, в то время как StrFormatByteSize64A может быть вызвана напрямую, StrFormatByteSize64W не определена. При вызове StrFormatByteSize64 с Unicode значением используется StrFormatByteSizeW.

Импорт в Delphi объявлен следующим образом:

function StrFormatByteSize64; external shlwapi32 name 'StrFormatByteSize64W';

Это является переводческой ошибкой в RTL Delphi. Функция StrFormatByteSize64W фактически не существует в shlwapi.dll.

Корректное использование

Для решения проблемы следует использовать функцию StrFormatByteSize вместо StrFormatByteSize64. Это автоматически обрабатывается заголовками Windows, но Embarcadero не учли эту особенность при переводе.

Пример программы, демонстрирующей правильное использование функции:

program ConvertBytesToString;
{$APPTYPE CONSOLE}
uses
  System.SysUtils,
  Winapi.ShLwApi;
var
  ThisSize: Int64;
  szBuf: array[0..255] of Char;
  cchBuf: Cardinal;
begin
  ThisSize := Int64(1024)*1024*1024*256;
  SetLength(szBuf, SizeOf(szBuf) - 1); // Выделение памяти с учетом нуль-терминатора
  cchBuf := Length(szBuf);
  Winapi.ShLwApi.StrFormatByteSize(ThisSize, szBuf[1], cchBuf);
  // Учитываем, что первый символ для нуль-терминатора
  Result := szBuf;
  Dec(cchBuf);
  szBuf[cchBuf] := #0;
  Writeln(szBuf);
end;

Вывод программы:

256 GB

Заключение

Проблема, с которой сталкиваются разработчики в Delphi 10.4 при использовании StrFormatByteSize64, связана с ошибкой в импорте функции. Исправление заключается в использовании функции StrFormatByteSize вместо StrFormatByteSize64. Ошибка была сообщена Embarcadero (https://quality.embarcadero.com/browse/RSP-29943), и разработчикам рекомендуется следить за обновлениями RTL для устранения подобных проблем.

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

### Описание Разработчики Delphi 10.4 сталкиваются с ошибкой при использовании функции `StrFormatByteSize64` из-за неправильного импорта, что приводит к runtime ошибке из-за отсутствия точкого входа в DLL, и решается заменой на корректную функцию `StrFo


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

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