如何将 LoadStringFromFile 函数从 Inno Setup 5 更改为 Inno Setup 6 并使其工作

How to change LoadStringFromFile function from Inno Setup 5 to Inno Setup 6 and make it work

我正在尝试将我的代码从 Inno Setup 5 转换为 6。我无法使以下代码工作。

我原来的工作代码是:

procedure CurStepChanged(CurStep: TSetupStep);
var
  FileData: String;
begin
  if (CurStep = ssInstall) then
  begin
    LoadStringFromFile(ExpandConstant('{code:GetSvcDir|2}\PostSteps.ps1'), FileData);
    StringChange(FileData, 'ScvProdPath', ExpandConstant('{code:GetSvcDir|0}\'));
    StringChange(FileData, 'ProdSitePath', ExpandConstant('{code:GetWebDir|0}\'));
    StringChange(FileData, 'ProdAuthPath', ExpandConstant('{code:GetWebDir|1}\'));
    StringChange(FileData, '444', ExpandConstant('{code:GetConfig|4}'));
    StringChange(FileData, '8732', ExpandConstant('{code:GetConfig|3}'));
    StringChange(FileData, 'RV_ExceptionsPath', ExpandConstant('{code:GetSvcDir|2}\RVExceptions'));
    SaveStringToFile(ExpandConstant('{code:GetSvcDir|2}\PostSteps.ps1'), FileData, False);
  end;
end;

看了一些类似的文章后,我试图改变它,但我不能让它工作。

procedure CurStepChanged(CurStep: TSetupStep);
var
  FileData: AnsiString;
  UnicodeStr: string;
begin
  if (CurStep = ssInstall) then
  begin
    LoadStringFromFile(ExpandConstant('{code:GetSvcDir|2}\PostSteps.ps1'), FileData);
    StringChangeEx(UnicodeStr, 'ScvProdPath', ExpandConstant('{code:GetSvcDir|0}\'), True);
    StringChangeEx(UnicodeStr, 'ProdSitePath', ExpandConstant('{code:GetWebDir|0}\'), True);
    StringChangeEx(UnicodeStr, 'ProdAuthPath', ExpandConstant('{code:GetWebDir|1}\'), True);
    StringChangeEx(UnicodeStr, '444', ExpandConstant('{code:GetConfig|4}'), True);
    StringChangeEx(UnicodeStr, '8732', ExpandConstant('{code:GetConfig|3}'), True);
    StringChangeEx(UnicodeStr, 'RV_ExceptionsPath', ExpandConstant('{code:GetSvcDir|2}\RVExceptions'), True);
    SaveStringToFile(ExpandConstant('{code:GetSvcDir|2}\PostSteps.ps1'), FileData, False);
  end;
end;

文件内的文字是英文,没有什么特别的。你能帮帮我吗?

正如我对您之前的问题的评论,这与从 Inno Setup 5 升级到 Inno Setup 6 无关。Inno Setup 6 与 Inno Setup 5 代码兼容。您的问题是您使用了 Inno Setup 5 的遗留 Ansi 版本。而 Inno Setup 6 只有 Unicode 版本。即使是 Inno Setup 5,你也应该使用 Unicode 版本。 参见

一般来说,你不应该使用AnsiString。这是 Ansi 版本的遗留问题。使用 AnsiString,如果用户在路径中使用 non-ASCII 个字符,您的代码将失败。

所以最后,你的问题或多或少是重复的:


无论如何,回答你的字面问题:你永远不会分配 UnicodeStr 变量。

与您之前的问题一样:不要使用 ExpandConstant 调用函数。

procedure CurStepChanged(CurStep: TSetupStep);
var
  FileData: AnsiString;
  UnicodeStr: string;
begin
  if (CurStep = ssInstall) then
  begin
    LoadStringFromFile(GetSvcDir('2') + '\PostSteps.ps1', FileData);
    UnicodeStr := FileData;
    StringChangeEx(UnicodeStr, 'ScvProdPath', GetSvcDir('0') + '\', True);
    StringChangeEx(UnicodeStr, 'ProdSitePath', GetWebDir('0') + '\', True);
    StringChangeEx(UnicodeStr, 'ProdAuthPath', GetWebDir('1') + '\', True);
    StringChangeEx(UnicodeStr, '444', GetConfig('4'), True);
    StringChangeEx(UnicodeStr, '8732', GetConfig('3'), True);
    StringChangeEx(UnicodeStr, 'RV_ExceptionsPath', GetSvcDir('2') + '\RVExceptions', True);
    FileData := UnicodeStr;
    SaveStringToFile(GetSvcDir('2') + '\PostSteps.ps1', FileData, False);
  end;
end;

(未测试)

那时你可能甚至不需要这些函数——你可以将它们内联到上面的代码中,除非你在其他地方使用它们。

您还会发现 AddBackslash function 有用。