inno-setuppascalscript

Inno Setup ParseVersion is not callable from [Code]


The macros ParseVersion and RemoveBackslash, for example, are both declared in ISPPBuiltins.iss. If I attempt to call both from within [Code]:

function InitializeSetup: Boolean;
var
    Major, Minor, Rev, Build: Integer;
begin
    RemoveBackslash('123\');
    ParseVersion('12345', Major, Minor, Rev, Build);
end;

RemoveBackslash compiles fine, but adding ParseVersion causes a compiler error:

Unknown identifier 'ParseVersion'"

When part of another macro declaration, ParseVersion seems to compile fine, just not from [Code]. Should I be able call it like that?


Solution

  • As @Andrew wrote already, the ParseVersion (or actually since Inno Setup 6.1, the GetVersionComponents) is a preprocessor function. So it has to be called using preprocessor directives and its results stored into preprocessor variables.

    #define Major
    #define Minor
    #define Rev
    #define Build
    #expr GetVersionComponents("C:\path\MyProg.exe", Major, Minor, Rev, Build)
    

    If you need to use the variables in the Pascal Script Code, you again need to use preprocessor syntax. For example:

    [Code]
    
    function InitializeSetup: Boolean;
    begin
      MsgBox('Version is: {#Major}.{#Minor}.{#Rev}.{#Build}.', mbInformation, MB_OK);
      Result := True;
    end;
    

    The above is true, if you really want to extract the version numbers on the compile-time. If you actually want to do it in the Code section, i.e. on the install-time, you have to use Pascal Script support function GetVersionComponents (yes, the same name, but a different language):

    [Code]
    
    function InitializeSetup: Boolean;
    var
      Major, Minor, Rev, Build: Word;
      Msg: string;
    begin
      GetVersionComponents('C:\path\MyProg.exe', Major, Minor, Rev, Build);
      Msg := Format('Version is: %d.%d.%d.%d', [Major, Minor, Rev, Build]);
      MsgBox(Msg, mbInformation, MB_OK);
      Result := True;
    end;
    

    The Pascal Script function GetVersionComponents is available since Inno Setup 6.1 only.


    The RemoveBackslash works in both contexts, as there's both Pascal Script RemoveBackslash and Preprocessor RemoveBackslash.