我对 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}";
但这并没有编译,它说:
“未知常量“MyAppMajor”。如果使用两个连续的“{”字符 您正在尝试嵌入单个“{”而不是常量“。
有没有办法对版本控制或其他常量执行类似的操作?
您错过了使用
#
字符(或 #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}
虽然我没有在 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;