在 Inno Setup 中使用 Define 和 Constant

Use Define and Constant in Inno Setup

我对 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}";

但这并没有编译,它说:

"Unknown constant "MyAppMajor。如果您尝试嵌入单个“{”而不是常量,请使用两个连续的“{”字符

有没有办法为版本控制或其他常量做类似的事情?

虽然我没有在 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;

您错过了使用 # 字符(或 #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}";

当缺少这个时,编译器期望(内置)名为 MyAppMajorMyAppMinor 等的常量,它们不存在;因此错误。

但是,您要复制的内容可能作为 AppVersion 指令内置在 Inno Setup 中。它可能有用,例如结合从其包含的文件版本信息中读取应用程序二进制文件的版本:

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

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