[英]Evaluate a collection of data from preprocessor on run time in Inno Setup Pascal Script
[英]Evaluate preprocessor macro on run time in Inno Setup Pascal Script
我正在使用 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;
Foo
的Package
參數是正確的,但我收到一個編譯器錯誤說
[ISPP] 格式“%”沒有參數”。
似乎它不喜歡PartNumber
行上字符串中的#
。 即使在普通字符串中包含#
也會給出“未終止的預處理器指令”錯誤,所以我認為它將#
解釋為精度說明符或其他東西。
有沒有辦法讓它把#
作為文本的一部分,以便我可以以編程方式擴展這個常量? 如果沒有,是否還有其他方法可以實現這一目標?
這是行不通的。
PartNumber
是一個預處理器函數/宏。 它在編譯時進行評估。 它在運行時不存在。
當然,您可以實現等效的 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
函數擴展了Package1
預處理器定義。
它不是!
{#...}
語法(與{...}
相反)不是常量。 這是一個內聯預處理器指令調用,其中,當沒有明確指定指令時,隱含了emit
。 所以{#Package1}
與{#emit Package1}
相同。 並且作為每個預處理器構造,它都會在編譯時進行評估。
如果將SaveToFile
預處理器函數調用添加到腳本末尾:
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;
對於類似的問題,請參閱:
在 Inno Setup Pascal Script 中在運行時評估來自預處理器的數據集合
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.