如何使用inno setup来读取配置文件中的参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用inno setup来读取配置文件中的参数相关的知识,希望对你有一定的参考价值。

晕,Inno 有 这样的函数的

// INI 文件函数

function IniKeyExists(const Section, Key, Filename: String): Boolean;
function IsIniSectionEmpty(const Section, Filename: String): Boolean;

function GetIniBool(const Section, Key: String; const Default: Boolean; const Filename: String): Boolean;
function GetIniInt(const Section, Key: String; const Default, Min, Max: Longint; const Filename: String): Longint;
function GetIniString(const Section, Key, Default, Filename: String): String;

function SetIniBool(const Section, Key: String; const Value: Boolean; const Filename: String): Boolean;
function SetIniInt(const Section, Key: String; const Value: Longint; const Filename: String): Boolean;
function SetIniString(const Section, Key, Value, Filename: String): Boolean;

procedure DeleteIniSection(const Section, Filename: String);
procedure DeleteIniEntry(const Section, Key, Filename: String);

另外,也有这样的用法:

ExpandConstant(\'ini:app\\Boot.ini,boot loader,backup\'

当然 如果你用 ISPP 的话,还有一些函数,我就不详述了,

PS:如果可以的话,建议 你以后 在 run段 加上 这个标记: postinstall
参考技术A // INI 文件函数

function IniKeyExists(const Section, Key, Filename: String): Boolean;
function IsIniSectionEmpty(const Section, Filename: String): Boolean;

function GetIniBool(const Section, Key: String; const Default: Boolean; const Filename: String): Boolean;
function GetIniInt(const Section, Key: String; const Default, Min, Max: Longint; const Filename: String): Longint;
function GetIniString(const Section, Key, Default, Filename: String): String;

function SetIniBool(const Section, Key: String; const Value: Boolean; const Filename: String): Boolean;
function SetIniInt(const Section, Key: String; const Value: Longint; const Filename: String): Boolean;
function SetIniString(const Section, Key, Value, Filename: String): Boolean;

procedure DeleteIniSection(const Section, Filename: String);
procedure DeleteIniEntry(const Section, Key, Filename: String);

如何解析Inno Setup中的JSON字符串?

我有以下JSON:

{"key1": "value1", "key2": 2}

不幸的是TLama's Inno JSON Config library不能使用JSON字符串,只能使用json文件。

我试图使用JSON字符串而不是路径到json文件,但它不起作用。

if JSONQueryInteger('{"Info":{"User":2}}', 'Info', 'User', 0, IntValue) then
    MsgBox('User=' + IntToStr(IntValue), mbInformation, MB_OK);  

我知道我可以将我的JSON保存到文件中然后解析它但它看起来有点混乱。

如何解析Inno Setup中的JSON字符串?

答案

你可以用JsonParser library代替。它可以解析JSON字符串。

它不像JSONConfig.dll那么容易使用。但另一方面,它是一个原生的Pascal脚本代码。因此,它不仅可以从临时的.json文件中保存,还可以从临时的.dll中保存。

代码可以是:

[Code]

#include "JsonParser.pas"

function GetJsonRoot(Output: TJsonParserOutput): TJsonObject;
begin
  Result := Output.Objects[0];
end;

function FindJsonValue(
  Output: TJsonParserOutput; Parent: TJsonObject; Key: TJsonString;
  var Value: TJsonValue): Boolean;
var
  I: Integer;
begin
  for I := 0 to Length(Parent) - 1 do
  begin
    if Parent[I].Key = Key then
    begin
      Value := Parent[I].Value;
      Result := True;
      Exit;
    end;
  end;

  Result := False;
end;

function FindJsonObject(
  Output: TJsonParserOutput; Parent: TJsonObject; Key: TJsonString;
  var Object: TJsonObject): Boolean;
var
  JsonValue: TJsonValue;
begin
  Result :=
    FindJsonValue(Output, Parent, Key, JsonValue) and
    (JsonValue.Kind = JVKObject);

  if Result then
  begin
    Object := Output.Objects[JsonValue.Index];
  end;
end;

function FindJsonNumber(
  Output: TJsonParserOutput; Parent: TJsonObject; Key: TJsonString;
  var Number: TJsonNumber): Boolean;
var
  JsonValue: TJsonValue;
begin
  Result :=
    FindJsonValue(Output, Parent, Key, JsonValue) and
    (JsonValue.Kind = JVKNumber);

  if Result then
  begin
    Number := Output.Numbers[JsonValue.Index];
  end;
end;

function FindJsonString(
  Output: TJsonParserOutput; Parent: TJsonObject; Key: TJsonString;
  var Str: TJsonString): Boolean;
var
  JsonValue: TJsonValue;
begin
  Result :=
    FindJsonValue(Output, Parent, Key, JsonValue) and
    (JsonValue.Kind = JVKString);
  if Result then
  begin
    Str := Output.Strings[JsonValue.Index];
  end;
end;

function ParseJsonAndLogErrors(
  var JsonParser: TJsonParser; const Source: WideString): Boolean;
var
  I: Integer;
begin
  ParseJson(JsonParser, Source);

  Result := (Length(JsonParser.Output.Errors) = 0);
  if not Result then
  begin
    Log('Error parsing JSON');
    for I := 0 to Length(JsonParser.Output.Errors) - 1 do
    begin
      Log(JsonParser.Output.Errors[I]);
    end;
  end;
end;

procedure ParseJsonString;
var
  Json: string;
  JsonParser: TJsonParser;
  I: Integer;
  JsonRoot, InfoObject: TJsonObject;
  UserNumber: TJsonNumber; { = Double }
  UserString: TJsonString; { = WideString = string }
begin
  Json := '{"Info":{"User":2,"String":"abc"}}';

  if ParseJsonAndLogErrors(JsonParser, Json) then
  begin
    JsonRoot := GetJsonRoot(JsonParser.Output);
    if FindJsonObject(JsonParser.Output, JsonRoot, 'Info', InfoObject) and
       FindJsonNumber(JsonParser.Output, InfoObject, 'User', UserNumber) and
       FindJsonString(JsonParser.Output, InfoObject, 'String', UserString) then
    begin
      Log(Format('Info:User:%d', [Round(UserNumber)]));
      Log(Format('Info:String:%s', [UserString]));
    end;
  end;

  ClearJsonParser(JsonParser);
end;

另一种选择是分叉Inno JSON Config库并添加对解析字符串的支持。

以上是关于如何使用inno setup来读取配置文件中的参数的主要内容,如果未能解决你的问题,请参考以下文章

[Inno Setup] 如何读取命令行输入的参数

使用Inno Setup安装具有不同配置的同一Windows服务的多个实例

inno setup静默安装的问题

Inno Setup - #define 指令 - 如何使用先前定义的变量?

用inno setup如何让程序在安装后删除安装文件夹中无用的文件?

如何使用 inno setup 结束进程?