【问题标题】:Evaluate preprocessor macro on run time in Inno Setup Pascal Script在 Inno Setup Pascal 脚本中评估运行时的预处理器宏
【发布时间】:2016-12-09 23:47:03
【问题描述】:

我正在使用 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;

FooPackage 参数是正确的,但我收到编译器错误提示

[ISPP] 格式“%”没有参数。

它似乎不喜欢PartNumber 行上的字符串中的#。即使在普通字符串中包含# 也会出现“未终止的预处理器指令”错误,所以我认为它会将# 解释为精度说明符或其他东西。

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

【问题讨论】:

  • 我假设Foo(ExpandConstant('{#Package1}'));,没有右括号。和它一样,它不会编译。

标签: inno-setup


【解决方案1】:

这行不通。

PartNumberpreprocessor function/macro。它在编译时进行评估。它在运行时不存在。


当然,您可以实现一个等效的 Pascal 脚本函数:

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 扩展为它的值。但是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

【讨论】:

  • 马丁一如既往的出色解释。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多