Ошибки в 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.