Programmversion von extern auslesen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Ich934
Lazarusforum e. V.
Beiträge: 316
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Programmversion von extern auslesen

Beitrag von Ich934 »

Hallo,

ich kann in den Projekteinstellungen eine Versionsinformation hinterlegen. Diese kann ich problemlos im Projekt selbst auslesen und verwenden. Dies funktioniert unter Windows und Linux.

Gibt es eine Möglichkeit, die Versionsinformation einer Anwendung mit einer anderen Anwendung auzulesen? Und wenn ja sowohl unter Windows als auch unter Linux?

Vielen Dank.

Schöne Grüße
Tipp für PostgreSQL: www.pg-forum.de

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Programmversion von extern auslesen

Beitrag von fliegermichl »

sysutils.GetFileVersion
Funktioniert aber afaik nur unter Windows

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Programmversion von extern auslesen

Beitrag von Winni »

fliegermichl hat geschrieben:
Fr 15. Okt 2021, 15:10
sysutils.GetFileVersion
Funktioniert aber afaik nur unter Windows
Yes! Win32 und WinCE only.

Winni

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Programmversion von extern auslesen

Beitrag von PascalDragon »

Ich934 hat geschrieben:
Fr 15. Okt 2021, 12:04
Gibt es eine Möglichkeit, die Versionsinformation einer Anwendung mit einer anderen Anwendung auzulesen? Und wenn ja sowohl unter Windows als auch unter Linux?
Dafür kannst du die Units des in FPC enthaltenen fcl-res Packages verwenden. Beispiel:

Code: Alles auswählen

program tres;

{$mode objfpc}

uses
  versionresource, winpeimagereader, elfreader, machoreader, resource;

var
  i, j: LongInt;
  res: TResources;
  ar: TAbstractResource;
begin
  res := TResources.Create;
  try
    for i := 1 to ParamCount do begin
      Writeln('Opening ', ParamStr(i));

      res.LoadFromFile(ParamStr(i));

      ar := res.Find(RT_VERSION, 1);
      if not (ar is TVersionResource) then begin
        Writeln('RT_VERSION 1 is not a version resource');
        Continue;
      end;

      Write('File Version: ');
      for j := 0 to 3 do begin
        if j > 0 then
          Write('.');
        Write(TVersionResource(ar).FixedInfo.FileVersion[j]);
      end;
      Writeln;
    end;
  finally
    res.Free;
  end;
end.
Ausgabe:

Code: Alles auswählen

PS D:\fpc\git> .\testoutput\tres.exe D:\lazarus\svn\lazarus.exe C:\Windows\System32\kernel32.dll
Opening D:\lazarus\svn\lazarus.exe
File Version: 2.3.0.0
Opening C:\Windows\System32\kernel32.dll
File Version: 10.0.19041.1202
Funktioniert unter allen von FPC unterstützten Plattformen, bei denen dieses Package vorhanden ist (also fast alles außer Platformen wie AVR, Z80 und so ;) ) und unterstützt werden Windows Binaries sowie ELF (Linux, BSDs, etc.) und Mach-O (macOS) Binaries, wobei bei letzteren beiden diese von FPC erstellt worden sein müssen, da nur dann die Versionsinformation als Ressource vorhanden ist.
FPC Compiler Entwickler

Benutzeravatar
Ally
Beiträge: 263
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Programmversion von extern auslesen

Beitrag von Ally »

hier noch eine Unit.

Gruß Roland

----------------

Code: Alles auswählen

// ----------------------------------------------------------------------------
//  rhsVersionFromFile
// ----------------------------------------------------------------------------
//
// Example:
// Label1 := GetVersionFromFile('C:\Test.exe', 4);
// ----------------------------------------------------------------------------

unit rhsVersionFromFile;

{$mode objfpc}{$H+}

interface

uses
  SysUtils, FileInfo, winpeimagereader, elfreader, machoreader;

function GetVersionFromFile(Filename: String; SubVer: Integer): String;

implementation

function GetVersionFromFile(Filename: String; SubVer: Integer): String;
var
  VI: TVersionInfo;
begin
  try
    VI := TVersionInfo.Create;
    VI.Load(Filename);
    if SubVer > 0 then
      Result := IntToStr(VI.FixedInfo.FileVersion[0]);
    if SubVer > 1 then
      Result := Result + '.' + IntToStr(VI.FixedInfo.FileVersion[1]);
    if SubVer > 2 then
      Result := Result + '.' + IntToStr(VI.FixedInfo.FileVersion[2]);
    if SubVer > 3 then
      Result := Result + '.' + IntToStr(VI.FixedInfo.FileVersion[3]);
  except
    Result := '';
  end;
  VI.Free;
end;

end.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Programmversion von extern auslesen

Beitrag von af0815 »

Was meinst du genau unter anderer Anwendung ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Ich934
Lazarusforum e. V.
Beiträge: 316
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: Programmversion von extern auslesen

Beitrag von Ich934 »

af0815 hat geschrieben:
Fr 15. Okt 2021, 19:06
Was meinst du genau unter anderer Anwendung ?
Mit einer Anwendung die Versionsnummern einer zweiten .exe Datei unter Windows oder ELF-Binary unter Linux.

Die Klassen schau ich mir Mal an. Danke.
Tipp für PostgreSQL: www.pg-forum.de

Ich934
Lazarusforum e. V.
Beiträge: 316
Registriert: So 5. Mai 2019, 16:52
OS, Lazarus, FPC: ArchLinux und Windows mit FPCUPdeluxe (L: 2.0.X, FPC 3.2.0)
CPU-Target: x86_64, i386
Wohnort: Bayreuth

Re: Programmversion von extern auslesen

Beitrag von Ich934 »

PascalDragon hat geschrieben:
Fr 15. Okt 2021, 16:33
Dafür kannst du die Units des in FPC enthaltenen fcl-res Packages verwenden. Beispiel:
Funktioniert prima und ist genau das, was ich gesucht habe! Nochmals vielen Dank!
Tipp für PostgreSQL: www.pg-forum.de

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Programmversion von extern auslesen

Beitrag von PascalDragon »

Ich934 hat geschrieben:
So 17. Okt 2021, 20:33
PascalDragon hat geschrieben:
Fr 15. Okt 2021, 16:33
Dafür kannst du die Units des in FPC enthaltenen fcl-res Packages verwenden. Beispiel:
Funktioniert prima und ist genau das, was ich gesucht habe! Nochmals vielen Dank!
Das Beispiel von Ally ist noch etwas einfacher, setzt aber intern auf dem gleichen Code auf (mir war die Load Methode von TVersionInfo nicht bewusst).
FPC Compiler Entwickler

Antworten