我对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"。连续两次" {"如果你试图嵌入一个单词" {"而不是常数" 。
有没有办法为版本化或其他常量做类似的事情?
答案 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}";
当缺少这个时,编译器期望(内置)常量称为MyAppMajor
,MyAppMinor
等,它们不存在;因此错误。
但是,您尝试复制的内容可能是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;