2

I'm creating a Inno Setup installer/updater for my application. Now I need to find a way to check if a new version is available and if it is available it should be installed automatically over the already installed version.

The special case is that the version number is in a file with other data. The file that Inno Setup need to read looks like:

#Eclipse Product File
#Fri Aug 18 08:20:35 CEST 2017
version=0.21.0
name=appName
id=appId

I already found a way to update the application using a script that only read a text file with the version number in it. Inno setup: check for new updates

But in my case it contains more data that the installer does not need. Can someone help me to build a script that can parse the version number out of the file?

The code that I already have looks like:

function GetInstallDir(const FileName, Section: string): string;
var
  S: string;
  DirLine: Integer;
  LineCount: Integer;
  SectionLine: Integer;    
  Lines: TArrayOfString;
begin
  Result := '';
Log('start');
  if LoadStringsFromFile(FileName, Lines) then
  begin
Log('Loaded file');
    LineCount := GetArrayLength(Lines);
    for SectionLine := 0 to LineCount - 1 do

Log('File line ' + lines[SectionLine]);


    if (pos('version=', Lines[SectionLine]) <> 0) then
                begin
                  Log('version found');
                  S := RemoveQuotes(Trim(Lines[SectionLine]));
                  StringChangeEx(S, '\\', '\', True);
                  Result := S;
                  Exit;
                end;
    end;
end;

But when running the script the check for checking if the version string is on the line does not work.

Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992
JimmyD
  • 2,629
  • 4
  • 29
  • 58
  • Stack Overflow is not a free coding service, although it sometimes looks like that – Thomas Weller Aug 21 '17 at 06:17
  • Possible duplicate of [InnoSetup: how to declare a variable by reading from a file](https://stackoverflow.com/questions/14530504/innosetup-how-to-declare-a-variable-by-reading-from-a-file) – Miral Aug 21 '17 at 07:03
  • Is it an INI file? Is there a section start? Or is this really the whole file, as it is? – Martin Prikryl Aug 21 '17 at 07:57
  • The example above it the whole file like it is. So it's not a ini file. – JimmyD Aug 21 '17 at 07:58

1 Answers1

2

Your code is almost correct. You are only missing begin and end around the code, that you want to repeat in the for loop. So only the Log line repeats; and the if is executed for out-of-the-range LineCount index.

It becomes obvious, if you format the code better:

function GetInstallDir(const FileName, Section: string): string;
var
  S: string;
  DirLine: Integer;
  LineCount: Integer;
  SectionLine: Integer;    
  Lines: TArrayOfString;
begin
  Result := '';
  Log('start');
  if LoadStringsFromFile(FileName, Lines) then
  begin
    Log('Loaded file');
    LineCount := GetArrayLength(Lines);
    for SectionLine := 0 to LineCount - 1 do
    begin { <--- Missing }
      Log('File line ' + lines[SectionLine] );

      if (pos('version=', Lines[SectionLine]) <> 0) then
      begin
        Log('version found');
        S := RemoveQuotes(Trim(Lines[SectionLine]));
        StringChangeEx(S, '\\', '\', True);
        Result := S;
        Exit;
      end;
    end; { <--- Missing }
  end;
end;
Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992