2017-12-14 5 views
1

Ich möchte mit Hilfe von Inno Setup ein Installationsprogramm erstellen. Damit das Programm auf jedem Computer funktioniert, muss ich das Werkzeugverzeichnis in einer .json-Datei ändern. Hier ist ein Auszug aus dieser Datei:Inno Setup: Wert im JSON-Array ändern

{ 
    "commandScriptLinux" : "", 
    "copyToolBehavior" : "once", 
    "deleteWorkingDirectoriesAfterWorkflowExecution" : true, 
    "deleteWorkingDirectoriesKeepOnErrorOnce" : true, 
    "deleteWorkingDirectoriesNever" : true, 
    "documentationFilePath" : "", 
    "enableCommandScriptWindows" : true, 
    "imitationScript" : "", 
    "imitationToolOutputFilename" : "", 
    "launchSettings" : 
    [ 
    { 
     "limitInstallationInstancesNumber" : "1", 
     "limitInstallationInstances" : "false", 
     "toolDirectory" : "%Selected Setup Folder%", 
     "version" : "1.0" 
    } 
    ], 
} 

Ich hoffte, dieses Problem zu lösen, indem die inno-json-config Bibliothek. Nach dem Ausführen des Codes sind die Zeilen leider umgekehrt (die letzte Zeile steht jetzt an erster Stelle), und die Änderungen wurden nicht vorgenommen.

[Setup] 
AppName=Change_Config 
AppVersion=1.0 
DefaultDirName={userdocs}\Change_Config 

[Files] 
Source: "JSONConfig.dll"; Flags: dontcopy 

[Code] 
function JSONQueryString(FileName, Section, Key, Default: WideString; 
    var Value: WideString; var ValueLength: Integer): Boolean; 
    external '[email protected]:jsonconfig.dll stdcall'; 
function JSONWriteString(FileName, Section, Key, 
    Value: WideString): Boolean; 
    external '[email protected]:jsonconfig.dll stdcall'; 

procedure InitializeWizard; 
var 
    FileName: WideString; 
    IntValue: Int64; 
    StrValue: WideString; 
    StrLength: Integer; 
    BoolValue: Boolean; 
begin 
    FileName := 'c:\configuration.json'; 
    SetLength(StrValue, 16); 
    StrLength := Length(StrValue); 

    if JSONQueryString(
     FileName, 'launchSettings', 'toolDirectory', 'Default', StrValue, StrLength) then 
    MsgBox('Section_1:Key_1=' + StrValue, mbInformation, MB_OK); 

    if not JSONWriteString(FileName, 'launchSettings', 'toolDirectory', 'Test') then 
    MsgBox('JSONWriteString Section_1:Key_1 failed!', mbError, MB_OK); 
end; 

Vielen Dank für Ihre Unterstützung!

Regards, Alex

Antwort

0

Die launchSettings ist ein Array. Ich glaube, dass die inno-json-config Bibliothek Arrays nicht unterstützt.

Sie können stattdessen JsonParser library verwenden.

[Code] 

#include "JsonParser.pas" 

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 FindJsonArray(
    Output: TJsonParserOutput; Parent: TJsonObject; Key: TJsonString; 
    var Arr: TJsonArray): Boolean; 
var 
    JsonValue: TJsonValue; 
begin 
    Result := 
    FindJsonValue(Output, Parent, Key, JsonValue) and 
    (JsonValue.Kind = JVKArray); 

    if Result then 
    begin 
    Arr := Output.Arrays[JsonValue.Index]; 
    end; 
end; 

{ ... } 

var 
    JsonLines: TStringList; 
    JsonParser: TJsonParser; 
    LaunchSettingsArray: TJsonArray; 
    ToolDirectoryValue: TJsonValue; 
    I: Integer; 
begin 
    { ... } 

    JsonLines := TStringList.Create; 
    JsonLines.LoadFromFile(FileName); 

    ParseJson(JsonParser, JsonLines.Text); 

    if Length(JsonParser.Output.Errors) > 0 then 
    begin 
    Log('Error parsing JSON'); 
    for I := 0 to Length(JsonParser.Output.Errors) - 1 do 
    begin 
     Log(JsonParser.Output.Errors[I]); 
    end; 
    end 
    else 
    begin 
    if FindJsonArray(
     JsonParser.Output, JsonParser.Output.Objects[0], 
     'launchSettings', LaunchSettingsArray) and 
     (GetArrayLength(LaunchSettingsArray) >= 0) and 
     (LaunchSettingsArray[0].Kind = JVKObject) and 
     FindJsonValue(
     JsonParser.Output, 
     JsonParser.Output.Objects[LaunchSettingsArray[0].Index], 'toolDirectory', 
     ToolDirectoryValue) and 
     (ToolDirectoryValue.Kind = JVKString) then 
    begin 
     Log(Format(
     'launchSettings[0]:toolDirectory:%s', [ 
     JsonParser.Output.Strings[ToolDirectoryValue.Index]])); 
     JsonParser.Output.Strings[ToolDirectoryValue.Index] := 'Test'; 
     JsonLines.Clear; 
     PrintJsonParserOutput(JsonParser.Output, JsonLines); 
     JsonLines.SaveToFile(FileName); 
    end; 
    end; 

    ClearJsonParser(JsonParser); 
    JsonLines.Free; 
end; 

Es wird immer noch nicht die Reihenfolge beibehalten (aber das sollte nicht wichtig sein).


In diesem Fall müssen Sie den JSON nicht parsen. Sie können einfach %Selected Setup Folder% durch den gewünschten Wert ersetzen.

Siehe Replace placeholder in an installed text file with input entered by user.