我想为Inno Setup创建一个脚本,其中安装路径将从定义目录中的文件中获取-没有注册表。我想这将需要为它编写特定的代码,其中将定义一些变量,其中将包含读取文件后的值。对于任何用户,文件的路径和名称都是相同的,所以唯一改变的值是安装路径。
完整结构,其中InstallLocation
为变量:
{
"FormatVersion": 0,
"bIsIncompleteInstall": false,
"AppVersionString": "1.0.1",
...
"InstallLocation": "h:\Program Files\Epic Games\Limbo",
...
}
有什么理想的代码可以做到这一点吗?
谢谢
实现一个脚本常量,为DefaultDirName
指令提供值。
你可以使用JsonParser库解析JSON配置文件。
[Setup]
DefaultDirName={code:GetInstallLocation}
[Code]
#include "JsonParser.pas"
// Here go the other functions the below code needs.
// See the comments at the end of the post.
const
CP_UTF8 = 65001;
var
InstallLocation: string;
<event('InitializeSetup')>
function InitializeSetupParseConfig(): Boolean;
var
Json: string;
ConfigPath: string;
JsonParser: TJsonParser;
JsonRoot: TJsonObject;
S: TJsonString;
begin
Result := True;
ConfigPath := 'C:pathtoconfig.json';
Log(Format('Reading "%s"', [ConfigPath]));
if not LoadStringFromFileInCP(ConfigPath, Json, CP_UTF8) then
begin
MsgBox(Format('Error reading "%s"', [ConfigPath]), mbError, MB_OK);
Result := False;
end
else
if not ParseJsonAndLogErrors(JsonParser, Json) then
begin
MsgBox(Format('Error parsing "%s"', [ConfigPath]), mbError, MB_OK);
Result := False;
end
else
begin
JsonRoot := GetJsonRoot(JsonParser.Output);
if not FindJsonString(JsonParser.Output, JsonRoot, 'InstallLocation', S) then
begin
MsgBox(Format('Cannot find InstallLocation in "%s"', [ConfigPath]),
mbError, MB_OK);
Result := False;
end
else
begin
InstallLocation := S;
Log(Format('Found InstallLocation = "%s"', [InstallLocation]));
end;
ClearJsonParser(JsonParser);
end;
end;
function GetInstallLocation(Param: string): string;
begin
Result := InstallLocation;
end;
代码使用的函数来自:
- 如何在Inno设置中解析JSON字符串?(
ParseJsonAndLogErrors
,ClearJsonParser
,GetJsonRoot
,FindJsonValue
,FindJsonString
); - Inno Setup -将字符串数组转换为Unicode并返回到ANSI (
MultiByteToWideChar
和LoadStringFromFileInCP
)。