Search code examples
inno-setuppascalscript

Evaluate a collection of data from preprocessor on run time in Inno Setup Pascal Script


I am trying to get Inno Setup define value in Code section but not with {#VersionTool1}. I need to pass defined name dynamically, because there are a lot of them (I want to avoid large switch case). I tried SetupSetting but it's not in Setup section (it's before it). Is there any way to do this?

#define VersionTool1 2019.01.1111
#define VersionTool2 2020.02.2111

...

[Code]

procedure SetSelectedTool(ToolName: String);
var
  CurrentTool: string;
begin
  ...
  CurrentTool := 'Version' + ToolName;
  CurrentToolVersion := {#CurrentTool};
  ...
end;

Value of local variable CurrentTool wil for example be 'VersionTool1' and I want to get value of VersionTool1 preprocessor variable which is 2020.02.2111.


Solution

  • It's not possible, see Evaluate preprocessor macro on run time in Inno Setup Pascal Script.


    But there are other solutions.

    For example:

    [Code]
    var
      ToolNames: TStringList;
      ToolVersions: TStringList;
    
    function InitializeSetup(): Boolean;
    begin
      ToolNames := TStringList.Create;
      ToolVersions := TStringList.Create;
    
      #define AddToolVersion(Name, Version) \
        "ToolNames.Add('" + Name + "'); ToolVersions.Add('" + Version +"');"
    
      #emit AddToolVersion('Tool1', '2019.01.1111')
      #emit AddToolVersion('Tool2', '2020.02.2111')
      // ...
    
      Result := True;
    end;
    

    (of course, the above makes sense only if you actually do not hardcode the version numbers, but use a code that only a preprocessor can do – something like GetStringFileInfo, what I've understood from your comments that you plan to)


    And then you can have a function like:

    function GetToolVersion(ToolName: string): string;
    var
      I: Integer;
    begin
      I := ToolNames.IndexOf(ToolName);
      if I >= 0 then Result := ToolVersions[I];
    end;
    

    Another similar questions: