在Inno Setup中使用Define和Constant

Alg*_*rys 6 inno-setup

我对Inno Setup中的#define有疑问.如果我做了一些修改,我会设置一个运行良好的设置,我正在考虑app的未来.例如,如果我更改版本(Major,Minor,Build,Patch,...),我不想每次都更改所有行(如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}";
Run Code Online (Sandbox Code Playgroud)

但这不编译,它说:

"Unknown constant"MyAppMajor".如果你试图嵌入单个"{"而不是常量,则使用两个连续的"{"字符.

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

TLa*_*ama 8

您错过了使用#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}";
Run Code Online (Sandbox Code Playgroud)

如果缺少此,预计编译器(内置)常数叫MyAppMajor,MyAppMinor等,其不存在; 因此错误.

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

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

[Setup]
...
AppVersion={#AppVersion}
Run Code Online (Sandbox Code Playgroud)

  • 是的,只要记住,“{#...}”代表“#emit”,并且在定义变量时不能使用“emit”。您需要这样使用变量,因此请使用 `#define MyAppVersion MyAppMajor + "." + MyAppMinor +“。” + MyAppBuild +“。” + MyAppPatch` 代替。 (2认同)