在 Inno Setup 中使用 Define 和 Constant

问题描述 投票:0回答:2

我对 Inno Setup 中的 #define 有疑问。我已经做了一个运行良好的设置,如果我需要做一些修改,我正在考虑应用程序的未来。例如,如果我更改版本(主要、次要、构建、补丁...),我不想每次都更改所有行(如注册表)。

所以我尝试做类似的东西:

#define MyAppMajor "5"
#define MyAppMinor "5"
#define MyAppBuild "1"
#define MyAppPatch "1"

...

[Files]    
Source: "D:\ProgramFiles\..."; DestDir: "{app}\Program\{MyAppMajor}.{MyAppMinor}\"; Flags: ignoreversion;

[Registry]
Root: "HKLM32"; Subkey: "Software\program\"; ... ; ValueData: "{MyAppMajor}.{MyAppMinor}.{MyAppBuild}.{MyAppPatch}";

但这并没有编译,它说:

“未知常量“MyAppMajor”。如果使用两个连续的“{”字符 您正在尝试嵌入单个“{”而不是常量“

有没有办法对版本控制或其他常量执行类似的操作?

inno-setup
2个回答
10
投票

您错过了使用

#
字符(或
#emit
,这是其更长的版本),它用于将定义的变量内联到脚本中,例如:

#define MyAppMajor "5"
#define MyAppMinor "5"
#define MyAppBuild "1"
#define MyAppPatch "1"

[Files]
...; DestDir: "{app}\Program\{#MyAppMajor}.{#MyAppMinor}\"; Flags: ignoreversion;

[Registry]
...; ValueData: "{#MyAppMajor}.{#MyAppMinor}.{#MyAppBuild}.{#MyAppPatch}";

当缺少这个时,编译器期望名为

MyAppMajor
MyAppMinor
等的(内置)常量,但这些常量并不存在;因此出现错误。

但是,您尝试复制的内容可能是内置在 Inno Setup 中的

AppVersion
指令。它可能有用,例如结合从包含的文件版本信息中读取应用程序二进制文件的版本:

#define AppVersion GetFileVersion('C:\MyApp.exe')

[Setup]
...
AppVersion={#AppVersion}

2
投票

虽然我没有在 Inno 的文档中找到明确说明的内容,但有一个示例,其中

+
运算符用于连接字符串。我想你可以通过这样的事情:

Source: "D:\ProgramFiles\..."; DestDir: "{app}\Program\" + MyAppMajor + "." + MyAppMinor + "\"; Flags: ignoreversion;

如果这不起作用,有一个

StringChange
预处理器宏应该可以工作,但会更丑陋,特别是在具有多个替换的字符串中:

#define MyAppMajor "5"
#define MyAppMinor "5"

#define InstallDirectory StringChange(StringChange("{app}\Program\%major%.%minor%", "%major", MyAppMajor), "%minor%", MyAppMinor)

Source: "D:\ProgramFiles\..."; DestDir: InstallDirectory; Flags: ignoreversion;
© www.soinside.com 2019 - 2024. All rights reserved.