ExpandConstant扩大Inno Setup“常量”, not 预处理器价值观。也可以看看在 Inno Setup Pascal 脚本中评估运行时的预处理器宏.
您无法使用运行时索引访问预处理器编译时数组的元素。
如果您了解 C/C++,就好像您尝试执行以下操作:
#define VALUE1 123
#define VALUE2 456
int index = 1;
int value = VALUE ## index
我不太确定我完全理解你在做什么。但似乎您需要在编译时从各种来源创建一个数组并在运行时使用它。
有几种方法可以用于此目的。但您肯定需要在运行时初始化运行时数组。但是初始化它的代码可以在编译时生成。
下面是该方法的一个示例(最后还有一些其他方法的链接)。
在脚本的开头,定义这些支持函数:
[Code]
var
FeatureDownloads: TStrings;
function AddFeature(
Feature: Integer; CommaSeparatedListOfDownloads: string): Boolean;
begin
if not Assigned(FeatureDownloads) then
begin
FeatureDownloads := TStringList.Create();
end;
while FeatureDownloads.Count <= Feature do
FeatureDownloads.Add('');
if FeatureDownloads[Feature] <> '' then
RaiseException('Downloads for feature already defined');
FeatureDownloads[Feature] := CommaSeparatedListOfDownloads;
Result := True;
end;
#define AddFeature(Feature, CommaSeparatedListOfDownloads) \
"<event('InitializeSetup')>" + NewLine + \
"function InitializeSetupFeature" + Str(Feature) + "(): Boolean;" + NewLine + \
"begin" + NewLine + \
" Result := AddFeature(" + Str(Feature) + ", '" + CommaSeparatedListOfDownloads + "');" + NewLine + \
"end;"
在您的组件包含文件中,执行以下操作:
#emit AddFeature(2, "01aed27862e2087bd117e9b677a8685aebb0be09744723b4a948ba78d6011bac,677756ac5969f814fd01ae677dbb832ab2e642513fea44ea0a529430d5ec1fdc")
如果您添加:
#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")
到主脚本的末尾,您将在Preprocessed.iss
由预处理器/编译器生成#emit指示扩展到:
<event('InitializeSetup')>
function InitializeSetupFeature2(): Boolean;
begin
Result := AddFeature(2, '01aed27862e2087bd117e9b677a8685aebb0be09744723b4a948ba78d6011bac,677756ac5969f814fd01ae677dbb832ab2e642513fea44ea0a529430d5ec1fdc');
end;
现在你有FeatureDownloads
您可以使用以下方式访问 Pascal Script 运行时变量FeatureDownloads[SelectedArray[0]]
获取逗号分隔的字符串,您可以将其解析为单独的下载。
这可以优化/改进很多,但我不知道/理解你的任务范围。但我相信,一旦你掌握了这个概念(一开始可能会很困难),你就能自己做。
另外一个类似的问题:
-
在 Inno Setup Pascal Script 中运行时评估来自预处理器的数据集合(简单的例子,一开始更容易掌握)
-
注册表部分的脚本功能(与时代略有不同的方法事件属性尚不可用 - 这是你的问题)