如何在 [Code] 部分使用 Inno Setup 预处理器指令?
How to use Inno Setup preprocessor directive in [Code] section?
我觉得这一定是我所缺少的一些简单的东西 - 在 Inno Setup 中,如果我传入了一个指令变量,我如何在 [Code]
部分中使用它?
假设我将 /DMYVAR=1
传递给 Inno Setup 引擎。
在我的 .iss 文件中,我可以有类似的东西:
[Setup]
AppName=MyApp v{#MYVAR}
在我的 [Code]
部分,我希望能够像这样使用它:
function IsVersionOne(param: String): boolean;
begin
Result := {#MYVAR} == "1";
end;
这行不通:(
预处理器不关心它的指令在哪里扩展。
因此 {#name}
语法 (inline preprocessor directive call) 在任何地方都适用,包括 Pascal 脚本。
不过,如果您想将 define
值作为一个字符串进行比较,您当然必须将其用引号括起来,使其成为一个字符串。另请注意,您的 == "1"
语法错误,Pascal 使用单 =
和单引号。
function IsVersionOne(param: String): boolean;
begin
Result := '{#MYVAR}' = '1';
end;
#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")
运行用/DMYVAR=1
编译,并检查生成的Preprocessed.iss
。它将显示:
function IsVersionOne(param: String): boolean;
begin
Result := '1' = '1';
end;
因为是数字,当然也可以用数值比较:
function IsVersionOne(param: String): boolean;
begin
Result := {#MYVAR} = 1;
end;
有关具有更详细信息的相关问题,请参阅 。
虽然上面回答了你的 字面问题 ,你的 function
签名实际上表明你想要实现 Check
function 来测试 compile-time 指令,例如:
[Files]
Source: "MYPROG.EXE"; DestDir: "{app}"; Check: IsVersionOne
这是一种低效的矫枉过正。
[Files]
#if MYVAR == "1"
Source: "MYPROG.EXE"; DestDir: "{app}"
#endif
#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")
如果您 运行 带有 /DMYVAR=1
的编译器,Preprocessed.iss
将显示:
[Files]
Source: "MYPROG.EXE"; DestDir: "{app}"
如果您运行 编译器具有不同的 DMYVAR
值,Preprocessed.iss
将显示:
[Files]
如果即使没有 /DMYVAR=
开关也需要编译脚本,请在脚本顶部定义一个默认值,例如:
#ifndef MYVAR
#define MYVAR "0"
#endif
我觉得这一定是我所缺少的一些简单的东西 - 在 Inno Setup 中,如果我传入了一个指令变量,我如何在 [Code]
部分中使用它?
假设我将 /DMYVAR=1
传递给 Inno Setup 引擎。
在我的 .iss 文件中,我可以有类似的东西:
[Setup]
AppName=MyApp v{#MYVAR}
在我的 [Code]
部分,我希望能够像这样使用它:
function IsVersionOne(param: String): boolean;
begin
Result := {#MYVAR} == "1";
end;
这行不通:(
预处理器不关心它的指令在哪里扩展。
因此 {#name}
语法 (inline preprocessor directive call) 在任何地方都适用,包括 Pascal 脚本。
不过,如果您想将 define
值作为一个字符串进行比较,您当然必须将其用引号括起来,使其成为一个字符串。另请注意,您的 == "1"
语法错误,Pascal 使用单 =
和单引号。
function IsVersionOne(param: String): boolean;
begin
Result := '{#MYVAR}' = '1';
end;
#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")
运行用/DMYVAR=1
编译,并检查生成的Preprocessed.iss
。它将显示:
function IsVersionOne(param: String): boolean;
begin
Result := '1' = '1';
end;
因为是数字,当然也可以用数值比较:
function IsVersionOne(param: String): boolean;
begin
Result := {#MYVAR} = 1;
end;
有关具有更详细信息的相关问题,请参阅
虽然上面回答了你的 字面问题 ,你的 function
签名实际上表明你想要实现 Check
function 来测试 compile-time 指令,例如:
[Files]
Source: "MYPROG.EXE"; DestDir: "{app}"; Check: IsVersionOne
这是一种低效的矫枉过正。
[Files]
#if MYVAR == "1"
Source: "MYPROG.EXE"; DestDir: "{app}"
#endif
#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")
如果您 运行 带有 /DMYVAR=1
的编译器,Preprocessed.iss
将显示:
[Files]
Source: "MYPROG.EXE"; DestDir: "{app}"
如果您运行 编译器具有不同的 DMYVAR
值,Preprocessed.iss
将显示:
[Files]
如果即使没有 /DMYVAR=
开关也需要编译脚本,请在脚本顶部定义一个默认值,例如:
#ifndef MYVAR
#define MYVAR "0"
#endif