首页 > 解决方案 > Inno Setup ParseVersion 不可从 [代码] 调用

问题描述

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

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

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

未知标识符‘ParseVersion’”

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

标签: inno-setuppascalscript

解决方案


正如@Andrew 已经写的那样,ParseVersion(或者实际上从Inno Setup 6.1开始, the 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 脚本支持功能GetVersionComponents(是的,名称相同,但语言不同):

[Code]

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

Pascal 脚本功能仅从Inno Setup 6.1GetVersionComponents开始可用。


在这RemoveBackslash两种情况下都有效,因为既有Pascal ScriptRemoveBackslash又有PreprocessorRemoveBackslash


推荐阅读