有没有办法在Inno Setup中实现abs(整数)类型函数?
我搜索了文档,但似乎不支持此功能。我也无法在互联网上找到与此有关的任何内容。
我需要一种在产生负数时返回正整数的方法。我正在使用公开的代码来复制GetVolumeInformation(见下文),只进行一次修改以允许它返回十进制值而不是十六进制值。但是,有时这会返回负数,因为我不认为Inno Setup会识别出DWORD应该是无符号整数。因此,例如,如果将VolumeSerialNumber返回为-12345678,则会删除减号。我尝试用这个修改代码:
var
absVolumeSerialNumber: Integer;
然后添加:
absVolumeSerialNumber := abs(VolumeSerialNumber);
Result := IntToStr(absVolumeSerialNumber);
但这会产生类型不匹配错误,因为我不认为支持abs(整数)函数。任何人都可以帮我这个吗?
//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 'GetVolumeInformationA@kernel32.dll 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
答案 0 :(得分:2)
Abs
类型没有Integer
函数重载。内置的Abs
函数具有以下原型,因此不适用于整数类型:
function Abs(E: Extended): Extended;
然而,制作自己的相当容易。这是写它的一种方法:
[Code]
function Abs(Value: Integer): Integer;
begin
Result := Value;
if Result < 0 then
Result := -Result;
end;