在Inno Setup中使用Define和Constant

时间:2015-01-16 14:07:24

标签: 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}";

但这并没有编译,它说:

"未知常数" MyAppMajor"。连续两次" {"如果你试图嵌入一个单词" {"而不是常数"

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

2 个答案:

答案 0 :(得分:8)

您错过了使用#字符(或#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等,它们不存在;因此错误。

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

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

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

答案 1 :(得分:0)

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