问题
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:
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;
    来源:https://stackoverflow.com/questions/60971940/evaluate-a-collection-of-data-from-preprocessor-on-run-time-in-inno-setup-pascal