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

时间:2019-06-22 08:42:31

标签: inno-setup pascalscript inno-setup-v6

我正在尝试将我的代码从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;

文件中的文本为英语,不是特别的东西。你能帮我吗?

1 个答案:

答案 0 :(得分:1)

正如我对您之前的问题所做的评论,这与从Inno Setup 5升级到Inno Setup 6无关。InnoSetup 6与Inno Setup 5代码兼容。您的问题是您使用了Inno Setup 5的旧版Ansi版本。InnoSetup 6仅具有Unicode版本。即使使用Inno Setup 5,您也应该使用Unicode版本。 参见Upgrading from Ansi to Unicode version of Inno Setup (any disadvantages)

通常,您不应使用AnsiString。这是Ansi版本的遗产。使用AnsiString,如果用户在路径中使用非ASCII字符,则代码将失败。

最后,您的问题或多或少重复了以下内容:
Inno Setup replace a string in a UTF-8 file without BOM


无论如何,要回答您的字面问题:您永远不会分配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有用。