In Delphi 10.4, When trying to use Winapi.ShLwApi.StrFormatByteSize64
to convert an Int64
file-size value into a formatted string I get a runtime error:
var
ThisSize: Int64;
pszBuf: PWideChar;
cchBuf: Cardinal;
Winapi.ShLwApi.StrFormatByteSize64(ThisSize, pszBuf, cchBuf);
Error message:
--------------------------- 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
How to solve this problem?
The remarks for the function in the documentation say:
StrFormatByteSize64 can be used for either ANSI or Unicode characters. However, while StrFormatByteSize64A can be called directly, StrFormatByteSize64W is not defined. When StrFormatByteSize64 is called with a Unicode value, StrFormatByteSizeW is used.
The Delphi import is declared as:
function StrFormatByteSize64; external shlwapi32 name 'StrFormatByteSize64W';
In other words, this is a translation error in the Delphi RTL. The function StrFormatByteSize64W
does not exist in shlwapi.dll
.
As the documentation says, call StrFormatByteSize
instead. This is handled for you by the Windows header files, but Embarcadero have not picked up this nuance when translating them.
This program demonstrates:
{$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.
Output:
256 GB
I have reported this to Embarcadero: https://quality.embarcadero.com/browse/RSP-29943
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With