Inno Setup ParseVersion 不可从 [Code] 调用

问题描述

例如,宏 ParseVersionRemoveBackslash 都在 ISPPBuiltins.iss 中声明。如果我尝试从 [Code] 中调用两者:

function InitializeSetup: Boolean;
var
    Major,Minor,Rev,Build: Integer;
begin
    RemoveBackslash('123\');
    ParseVersion('12345',Major,Build);
end;

RemoveBackslash 编译正常,但添加 ParseVersion 会导致编译器错误

未知标识符“ParseVersion””

作为另一个宏声明的一部分时,ParseVersion 似乎编译得很好,只是不是来自 [Code]。我应该可以这样称呼它吗?

解决方法

正如@Andrew 已经写过的那样,ParseVersion(或者实际上从 Inno Setup 6.1 起,GetVersionComponents)是一个预处理器函数。因此必须使用预处理器指令调用它,并将其结果存储到预处理器变量中。

#define Major
#define Minor
#define Rev
#define Build
#expr GetVersionComponents("C:\path\MyProg.exe",Major,Minor,Rev,Build)

如果需要使用 Pascal Script Code 中的变量,则再次需要使用预处理器语法。例如:

[Code]

function InitializeSetup: Boolean;
begin
  MsgBox('Version is: {#Major}.{#Minor}.{#Rev}.{#Build}.',mbInformation,MB_OK);
  Result := True;
end;

以上是正确的,如果你真的想在编译时提取版本号。如果您确实想在 Code 部分(即在安装时)执行此操作,则必须使用 Pascal Script support function GetVersionComponents(是的,名称相同,但语言不同):

[Code]

function InitializeSetup: Boolean;
var
  Major,Build: Word;
  Msg: string;
begin
  GetVersionComponents('C:\path\MyProg.exe',Build);
  Msg := Format('Version is: %d.%d.%d.%d',[Major,Build]);
  MsgBox(Msg,MB_OK);
  Result := True;
end;

Pascal Script 函数 GetVersionComponents 仅从 Inno Setup 6.1 开始可用。


RemoveBackslash 在这两种情况下都适用,因为同时存在 Pascal Script RemoveBackslashPreprocessor RemoveBackslash

,

Change Log(对于 6.1.x)中提到:

支持函数 GetFileVersionParseVersion 已分别重命名为 GetVersionNumbersStringGetVersionComponents。旧名称仍受支持,但建议将脚本更新为新名称,否则编译器会发出警告。

所以升级时要小心。但正如您所说,这些是Inno Setup Preprocessor (ISPP) 功能。关于 Pascal Script 部分,Support Function Reference 中没有列出任何内容。

其他人可能会对此提供更多见解,或提供解决方法,但您可能需要在信息设置 forum 中请求该功能。