gpt4 book ai didi

inno-setup - 在 Inno Setup Pascal Script 中在运行时评估预处理器宏

转载 作者:行者123 更新时间:2023-12-03 16:35:20 29 4
gpt4 key购买 nike

我正在使用 Inno Setup #define 指令来定义有关安装程序中软件包的所有信息,然后使用其他指令来提取该字符串的部分内容。例如,使用以下内容 PartNumber(Package1)将返回 05414。

#define Package1 "05414 - My Package"
#define PartNumber(str Package) Copy(Package, 1, 5)

我在脚本和代码中使用这种方法,它工作正常。但是,我遇到了一种情况,以编程方式生成字符串会很方便,但我无法让它正常工作。例如,我想做如下事情。

procedure Foo(Package: String);
var
PartNumber: String;
begin
PartNumber:= ExpandConstant(Format('{#PartNumber(%s)}', [Package]));
end;

procedure Bar();
begin
Foo(ExpandConstant('{#Package1)}'));
end;
Package论据 Foo是正确的,但我收到一个编译器错误说

[ISPP] No argument for format '%'".



好像不喜欢 #在字符串上 PartNumber线。甚至包括一个 #在普通字符串中给出了“未终止的预处理器指令”错误,所以我认为它正在解释 #作为精度说明符或其他东西。

有没有办法让它治疗 #作为文本的一部分,以便我可以以编程方式扩展此常量?如果没有,是否还有其他方法可以实现这一目标?

最佳答案

这是行不通的。
PartNumberpreprocessor function/macro .它在编译时进行评估。它在运行时不存在。

当然,您可以实现等效的 Pascal Script 函数:

function PartNumberPascal(Package: string): string;
begin
Result := Copy(Package, 1, 5);
end;

procedure Foo(Package: String);
var
PartNumber: String;
begin
PartNumber := PartNumberPascal(Package);
end;

可能让您感到困惑的是这个电话:

Foo(ExpandConstant('{#Package1}')); 

可能会给你的印象是 ExpandConstant function扩展 Package1预处理器定义。

它不是!
{#...}语法(与 {...} 相反)不是 constant .这是一个 inline preprocessor directive call ,其中,当没有明确指定指令时, emit 是暗示。所以 {#Package1}{#emit Package1} 相同.并且作为每个预处理器构造,它都会在编译时进行评估。

如果您 add SaveToFile preprocessor function call到脚本的结尾:

procedure Bar();
begin
Foo(ExpandConstant('{#Package1}'));
end;

#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")

编译后,检查一下 Preprocessed.iss 是什么就好像。你会看见:

procedure Bar();
begin
Foo(ExpandConstant('05414 - My Package'));
end;
Package1被扩展到它的值(value)。但是 ExpandConstant还在那里,因此它完全没用! (在 '05414 - My Package' 中没有常量)

这将具有相同的效果:

procedure Bar();
begin
Foo('{#Package1}');
end;

对于类似的问题,请参阅:
Evaluate a collection of data from preprocessor on run time in Inno Setup Pascal Script

关于inno-setup - 在 Inno Setup Pascal Script 中在运行时评估预处理器宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41070563/

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