Inno Setup - 如何在[Code]中使用预处理器指令?

时间:2018-02-21 20:20:52

标签: inno-setup pascalscript

我觉得这必须是我想要的简单 - 在Inno Setup中,如果我传入一个指令变量,我如何在[Code]部分内使用它?

说我将/DMYVAR=1传递给Inno Setup引擎。

在我的.iss文件中我可以有类似的内容:

[Setup]
AppName=MyApp v{#MYVAR}

在我的[Code]部分中,我希望能够像这样使用它:

function IsVersionOne(param: String): boolean;
begin
    Result := {#MYVAR} == "1";
end;

这不起作用:(

1 个答案:

答案 0 :(得分:3)

预处理器不关心,它的指令被扩展。

所以{#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;

有关更详细信息的相关问题,请参阅Evaluate preprocessor macro on run time in Inno Setup Pascal Script

虽然上面回答了您的文字问题,但您的function签名实际上表明您希望实现Check function来测试编译时指令的值,例如:

[Files]
Source: "MYPROG.EXE"; DestDir: "{app}"; Check: IsVersionOne

这是一种效率低下的过度杀伤。

改为使用preprocessor #if directive

[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