Winapi.ShLwApi.StrFormatByteSize64 рассматривает мое приложение как DLL

В Delphi 10.4 при попытке использовать Winapi.ShLwApi.StrFormatByteSize64 преобразовать Int64 значение размера файла в форматированную строку. Я получаю сообщение об ошибке выполнения:

var
  ThisSize: Int64;
  pszBuf: PWideChar;
  cchBuf: Cardinal;

Winapi.ShLwApi.StrFormatByteSize64(ThisSize, pszBuf, cchBuf);

Сообщение об ошибке:

--------------------------- MyApp.exe - точка входа не найдена
--------------- ------------ Точка входа в процедуру "StrFormatByteSize64W" не найдена в DLL "C: \ DELPHI \ MyApp \ Win32 \ Debug \ MyApp.exe".
--------------------------- В ПОРЯДКЕ


Как решить эту проблему?

1 ответ

Решение

В замечания для функции в документации сказать:

StrFormatByteSize64 можно использовать для символов ANSI или Unicode. Однако, хотя StrFormatByteSize64A можно вызывать напрямую, StrFormatByteSize64W не определен. Когда StrFormatByteSize64 вызывается со значением Unicode, используется StrFormatByteSizeW.

Импорт Delphi объявлен как:

function StrFormatByteSize64; external shlwapi32 name 'StrFormatByteSize64W';

Другими словами, это ошибка перевода в Delphi RTL. ФункцияStrFormatByteSize64W не существует в shlwapi.dll.

Как сказано в документации, звоните StrFormatByteSizeвместо. Этим занимаются файлы заголовков Windows, но Embarcadero не уловил этот нюанс при их переводе.

Эта программа демонстрирует:

{$APPTYPE CONSOLE}

uses
  System.SysUtils,
  Winapi.ShLwApi;

procedure Main;
var
  ThisSize: Int64;
  szBuf: array[0..255] of Char;
  cchBuf: Cardinal;
begin
  ThisSize := Int64(1024)*1024*1024*256;
  cchBuf := Length(szBuf);
  Winapi.ShLwApi.StrFormatByteSize(ThisSize, szBuf, cchBuf);
  Writeln(szBuf);
end;

begin
  try
    Main;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

Выход:

256 ГБ

Я сообщил об этом в Embarcadero: https://quality.embarcadero.com/browse/RSP-29943

Другие вопросы по тегам