1
votes

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.

1

1 Answers

0
votes

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;