inno-setup - InnoSetupabs(整数)函数

标签 inno-setup

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

相关文章:

inno-setup - Inno Setup 5.5.9 中的多个 WizardSmallImageFiles

c++ - 将 MFC 库复制到项目

inno-setup - 无法在 Inno Setup 欢迎页面上创建标签

inno-setup - Inno Setup - 如何增加组件列表中所有组件之间的间隔?

c++ - inno setup 编译器未运行我的 C/C++ 代码

installation - 在 Inno Setup 中安装之前,从目标文件夹中备份文件

java - InnoSetup : Detect if Java is 32-bit or 64-bit

hyperlink - 如何在安装程序上放置两个链接?

inno-setup - 仅在 Inno Setup 的特定页面播放声音

inno-setup - 获取 setup.exe 文件的文件名