有没有办法在Inno Setup中实现abs(integer)类型的函数?
我查了文档,好像不支持这个功能。我也无法在互联网上找到与此相关的任何内容。
我需要一种在产生负数时返回正整数的方法。我正在使用公开可用的代码来复制 GetVolumeInformation(见下文),并进行一项修改以允许它返回十进制值而不是十六进制值。但是,有时这会返回负数,因为我认为 Inno Setup 无法识别 DWORD 应该是无符号整数。因此,例如,如果 VolumeSerialNumber 返回为 -12345678,则会删除减号。我尝试用以下方法修改代码:
var
absVolumeSerialNumber: Integer;
然后添加:
absVolumeSerialNumber := abs(VolumeSerialNumber);
Result := IntToStr(absVolumeSerialNumber);
但这会导致类型不匹配错误,因为我认为不支持 abs(integer) 函数。谁能帮我解决这个问题吗?
//Public Domain code for GetVolumeInformation
function GetVolumeInformation(
lpRootPathName: PChar;
lpVolumeNameBuffer: PChar;
nVolumeNameSize: DWORD;
var lpVolumeSerialNumber: DWORD;
var lpMaximumComponentLength: DWORD;
var lpFileSystemFlags: DWORD;
lpFileSystemNameBuffer: PChar;
nFileSystemNameSize: DWORD
): BOOL;
external '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="abeccedffdc4c7dec6cee2c5cdc4d9c6cadfc2c4c5eaebc0ced9c5cec7989985cfc7c7" rel="noreferrer noopener nofollow">[email protected]</a> stdcall';
function LoWord(dw: DWORD): WORD;
begin
Result := WORD(dw);
end;
function HiWord(dw: DWORD): WORD;
begin
Result := WORD((dw shr 16) and $FFFF);
end;
function WordToHex(w: WORD): String;
begin
Result := Format('%.4x', [w]);
end;
function FindVolumeSerial(const Drive: String): String;
var
FileSystemFlags: DWORD;
VolumeSerialNumber: DWORD;
MaximumComponentLength: DWORD;
begin
Result := '';
// Note on passing PChars using RemObjects Pascal Script:
// '' pass a nil PChar
// #0 pass an empty PChar
if GetVolumeInformation(
PChar(Drive),
'', // nil
0,
VolumeSerialNumber,
MaximumComponentLength,
FileSystemFlags,
'', // nil
0)
then
//Result := WordToHex(HiWord(VolumeSerialNumber)) + WordToHex(LoWord(VolumeSerialNumber));
Result := IntToStr(VolumeSerialNumber); //Change to Public Domain code to use decimal value needed by the installer rather than the hex value
end;
//End of Public Domain code for GetVolumeInformation
最佳答案
Integer
类型没有 Abs
函数重载。内置 Abs
函数具有以下原型(prototype),因此它不能用于整数类型:
function Abs(E: Extended): Extended;
但是,自己制作一个非常容易。这是一种编写方法:
[Code]
function Abs(Value: Integer): Integer;
begin
Result := Value;
if Result < 0 then
Result := -Result;
end;
关于inno-setup - InnoSetupabs(整数)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25020606/