如何将 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 有用。
我正在尝试将我的代码从 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 有用。