Version des Programm's auslesen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Version des Programm's auslesen

Beitrag von Aphadias »

moin

Kann ich irgend wie die Version aus dem Programm auslesen was ich eingestellt habe unter Einstellungen? Wollte es in ein Label lesen.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Version des Programm's auslesen

Beitrag von Mathias »

Vielleicht hilft dir dies weiter: http://wiki.freepascal.org/Show_Applica ... nd_Company

Ich habe einen kleinen Code gemacht. Wichtig dabei ist, das die Versionsangabe auch in der Projekteinstellungen aktiviert ist, ansonsten kommt eine Fehlermeldung.

Code: Alles auswählen

uses
  fileinfo;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  FileVerInfo: TFileVersionInfo;
begin
  FileVerInfo := TFileVersionInfo.Create(nil);
  FileVerInfo.ReadFileInfo;
  ShowMessage(FileVerInfo.VersionStrings.Text);
  FileVerInfo.Free;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: Version des Programm's auslesen

Beitrag von Aphadias »

danke... habe jetzt nicht damit gerechnet das es mehr als ein einzeiler wird :lol:

brauche aber nur die version und habe das in ein label geladen so:

Code: Alles auswählen

version.Caption:='Version ' + FileVerInfo.VersionStrings.Values['FileVersion'];



Aber jetzt noch mal eine Frage zu dieser Versionsanzeige unter Projekteinstellungen. Ich habe eingestellt das er hochzählen soll jedes mal wenn ich Kompiliere und er macht es aber nicht. Früher ging das mal. Kann mir vllt jemand sagen warum das so ist?

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Version des Programm's auslesen

Beitrag von Mathias »

Aber jetzt noch mal eine Frage zu dieser Versionsanzeige unter Projekteinstellungen. Ich habe eingestellt das er hochzählen soll jedes mal wenn ich Kompiliere und er macht es aber nicht.

Dieser scheint nur hoch zu zählen, wen man [shift + F9] drückt. ( neu kompilieren)
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Aphadias
Beiträge: 124
Registriert: Mi 28. Okt 2015, 18:28

Re: Version des Programm's auslesen

Beitrag von Aphadias »

ja stimmt... danke

Benutzeravatar
willi4willi
Lazarusforum e. V.
Beiträge: 155
Registriert: Sa 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows, Linux (debian) / Lazarus 3.2 / FPC 3.2.2
CPU-Target: i386, win64, arm

Weitere Anfrage: Version des Programm's auslesen

Beitrag von willi4willi »

Hallo allerseits!

Wie kann man vorher prüfen, ob das Programm Versions-Informationen besitzt?

Ein "ReadFileInfo" wird in diesem Fall mit einen Fehler zurückkommen, den ich gern vermeiden möchte.

Die Eigenschaft "Enabled" vorher abzufragen bringt nichts. Sie wird erst nach dem "ReadFileInfo" TRUE.

Hat jemand eine Idee?
 

Viele Grüße

Willi4Willi

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

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Version des Programm's auslesen

Beitrag von m.fuchs »

Code: Alles auswählen

var
  ResHandle: TFPResourceHandle;
begin
  ResHandle := FindResource(Application.MainFormHandle, PChar(1), RT_VERSION);
  (* ... *)


Wenn ResHandle größer als 0 ist, müsste eine Versionsinfo enthalten sein.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
willi4willi
Lazarusforum e. V.
Beiträge: 155
Registriert: Sa 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows, Linux (debian) / Lazarus 3.2 / FPC 3.2.2
CPU-Target: i386, win64, arm

Re: Version des Programm's auslesen

Beitrag von willi4willi »

Das funktioniert leider nicht. Die Anwendung ist eine Konsoleanwendung. Hier das Beispiel:

Code: Alles auswählen

 
program project1;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils, CustApp
  {$IFDEF WINDOWS} ,Windows, JwaTlHelp32{$ENDIF}
  , fileinfo
  , winpeimagereader {need this for reading exe info}
  , elfreader {needed for reading ELF executables}
  , machoreader {needed for reading MACH-O executables}
  ;
 
type
 
  { TMyApplication }
  TMyApplication = class(TCustomApplication)
  private
    function GetProgramVersion(ExeFileName: String): String;
  protected
    procedure DoRun; override;
  public
  end;
 
{ TMyApplication }
 
Function TMyApplication.GetProgramVersion(ExeFileName : String) : String;
var
  FileVerInfo: TFileVersionInfo;
begin
  FileVerInfo:=TFileVersionInfo.Create(nil);
  try
    FileVerInfo.FileName:=ExeFileName;
//    if FileVerInfo.Enabled then     //<--- ist FALSE
//    begin
      FileVerInfo.ReadFileInfo;
      Result:=FileVerInfo.VersionStrings.Values['FileVersion'];
//    end;
  finally
    FileVerInfo.Free;
  end;
end;
 
procedure TMyApplication.DoRun;
begin
 
  Writeln(GetProgramVersion(Paramstr(0)));
 
  Write('ENTER-->');
  readln;
  Terminate;
end;
 
var
  Application: TMyApplication;
 
{$R *.res}
 
begin
  Application:=TMyApplication.Create(nil);
  Application.Title:='My Application';
  Application.Run;
  Application.Free;
end.
 
 


Gibt es noch eine andere Möglichkeit, wie man ermitteln kann, ob die Ressource eingebunden ist?
 

Viele Grüße

Willi4Willi

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

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Version des Programm's auslesen

Beitrag von m.fuchs »

Kein Problem, statt Application.MainFormHandle nimmst du dann HINSTANCE.

Code: Alles auswählen

function TMyApplication.GetProgramVersion(ExeFileName: String) : String;
var
  ResHandle: TFPResourceHandle;
  FileVerInfo: TFileVersionInfo;
begin
  ResHandle := FindResource(HINSTANCE, PChar(1), RT_VERSION);
  if ResHandle > 0 then begin
    FileVerInfo := TFileVersionInfo.Create(nil);
    try
      FileVerInfo.FileName := ExeFileName;
      FileVerInfo.ReadFileInfo;
      Result := FileVerInfo.VersionStrings.Values['FileVersion'];
    finally
      FileVerInfo.Free;
    end;
  end else
    Result := 'Unknown';
end
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
willi4willi
Lazarusforum e. V.
Beiträge: 155
Registriert: Sa 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows, Linux (debian) / Lazarus 3.2 / FPC 3.2.2
CPU-Target: i386, win64, arm

Re: Version des Programm's auslesen

Beitrag von willi4willi »

S U P E R !

Das hat geklappt, wenn man die Version des eigenen Programms haben möchte.

Was ist aber, wenn die Programmdatei eine andere ist, also nicht ParamStr(0)?
 

Viele Grüße

Willi4Willi

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

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Version des Programm's auslesen

Beitrag von m.fuchs »

Ist etwas komplizierter, aber nicht unmöglich:

Code: Alles auswählen

function TMyApplication.IsVersionResourceAvailable(ExeFileName: String): Boolean;
var
  FileResources: TResources;
  i: Integer;
begin
  Result := False;
  try
    FileResources := TResources.Create;
    FileResources.LoadFromFile(ExeFileName);
    if FileResources.Count > 0 then begin
      for i := 0 to (FileResources.Count - 1) do begin
        if FileResources.Items[i] is TVersionResource then Result := True
      end;
    end;
  finally
    FreeAndNil(FileResources);
  end;
end;


Benötigt zusätzlich die Units Resource und VersionResource. Ehrlich gesagt würde ich dann aber eher die Exception abfangen, anstatt diese aufwändige Prüfung vorher durchzuführen.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Benutzeravatar
willi4willi
Lazarusforum e. V.
Beiträge: 155
Registriert: Sa 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows, Linux (debian) / Lazarus 3.2 / FPC 3.2.2
CPU-Target: i386, win64, arm

[gelöst] Re: Version des Programm's auslesen

Beitrag von willi4willi »

Das funktioniert so einwandfrei.

Danke!
 

Viele Grüße

Willi4Willi

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

Antworten