Inno设置abs(整数)函数

时间:2014-07-29 16:41:57

标签: inno-setup

有没有办法在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

1 个答案:

答案 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;