"Variable expected" 使用 Inno Setup StringChangeEx 函数时出错

"Variable expected" error when using Inno Setup StringChangeEx function

我正在使用 Inno Download Plugin 为我的安装下载一堆文件。这些文件在“files.json”中列出。

FileList := TStringList.Create;
FileList.LoadFromFile(ExpandConstant('{tmp}\files.json'));
  
for i := 0 to FileList.Count-1 do
begin
  fileName := ExtractFileName(FileList[i]);
  
  StringChangeEx(FileList[i], '\', '/',True);

  //Add each file to download queque
  idpAddFile("www.myapiaddress.com/files/" + FileList[i], ExpandConstant('{tmp}\install\') + fileName );
  Log(FileList[i]);
end;

最让我头疼的是StringChangeEx(FileList[i], '\', '/',True)这行。一旦我把它放进去,idp.iss 就停止编译,给我错误:Variable expected on

procedure idpAddFile(url, filename: String);                     external 'idpAddFile@files:idp.dll cdecl';

安装程序编译正常,如果我从脚本中完全删除 StringChangeEx。把它放在不同的位置也无济于事...

任何想法,可能导致此问题的原因是什么?

StringChangeEx function 在第一个参数中需要一个 string 变量 (它声明为 var)。您只给它一个 string

如果 FileList 一个 string 数组 ,您的代码就可以工作。但它不是,它是一个 class,带有类似数组的 string 默认值 属性。使用 属性 值等同于使用 function/method return 值。对于 getter 和 setter 方法,属性 只是 syntactic sugar

您必须将值复制到 string 变量 并返回。

S := FileList[i];
StringChangeEx(S, '\', '/',True);
FileList[i] := S;

虽然您实际上不需要将其复制回去。


关于错误指向 idp.iss 文件的原因:Inno Setup 中似乎有一个错误,使得它报告错误,就好像它发生在 Pascal 脚本代码的第一行一样(在您的情况下,包含的 idp.iss 中的第一个真实代码)。我发布了 bug report. It was fixed already.