gpt4 book ai didi

inno-setup - 如何在 [Code] 部分使用 Inno Setup 预处理器指令?

转载 作者:行者123 更新时间:2023-12-05 02:16:53 27 4
gpt4 key购买 nike

我觉得这一定是我遗漏的一些简单的东西——在 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;

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


虽然上面回答了您的字面问题,但您的函数 签名实际上表明您想要实现一个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

关于inno-setup - 如何在 [Code] 部分使用 Inno Setup 预处理器指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48914783/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com