我对Inno Setup中的#define有疑问。我已经进行了设置,确定谁可以很好地工作,并且如果我需要做一些修改,我正在考虑应用程序的 future 。例如,如果我更改版本(主要,次要,构建,补丁等),则我不想每次都更改所有行(如Registry)。

所以我尝试做这样的事情:

#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”。如果要嵌入单个“{”而不是常量,请使用两个连续的“{”字符”。

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

最佳答案

您错过了使用# char(或 #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}

10-07 19:10