Version des Programm's auslesen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Version des Programm's auslesen

Beitragvon Aphadias » 11. Sep 2017, 17:08 Version des Programm's auslesen

moin

Kann ich irgend wie die Version aus dem Programm auslesen was ich eingestellt habe unter Einstellungen? Wollte es in ein Label lesen.
Aphadias
 
Beiträge: 117
Registriert: 28. Okt 2015, 18:28

Beitragvon Mathias » 11. Sep 2017, 17:28 Re: Version des Programm's auslesen

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4250
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Aphadias » 11. Sep 2017, 19:32 Re: Version des Programm's auslesen

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?
Aphadias
 
Beiträge: 117
Registriert: 28. Okt 2015, 18:28

Beitragvon Mathias » 11. Sep 2017, 19:35 Re: Version des Programm's auslesen

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4250
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Aphadias » 13. Sep 2017, 19:24 Re: Version des Programm's auslesen

ja stimmt... danke
Aphadias
 
Beiträge: 117
Registriert: 28. Okt 2015, 18:28

Beitragvon willi4willi » 5. Mär 2018, 21:23 Weitere Anfrage: Version des Programm's auslesen

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

------------
willi4willi
 
Beiträge: 106
Registriert: 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows (10), Linux (debinan) / FPC 3.0.4 / Lazarus 1.8.4 | 
CPU-Target: i386, win64, arm
Nach oben

Beitragvon m.fuchs » 5. Mär 2018, 22:27 Re: Version des Programm's auslesen

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
m.fuchs
 
Beiträge: 1963
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon willi4willi » 5. Mär 2018, 23:44 Re: Version des Programm's auslesen

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

------------
willi4willi
 
Beiträge: 106
Registriert: 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows (10), Linux (debinan) / FPC 3.0.4 / Lazarus 1.8.4 | 
CPU-Target: i386, win64, arm
Nach oben

Beitragvon m.fuchs » 5. Mär 2018, 23:56 Re: Version des Programm's auslesen

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
m.fuchs
 
Beiträge: 1963
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon willi4willi » 6. Mär 2018, 00:03 Re: Version des Programm's auslesen

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

------------
willi4willi
 
Beiträge: 106
Registriert: 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows (10), Linux (debinan) / FPC 3.0.4 / Lazarus 1.8.4 | 
CPU-Target: i386, win64, arm
Nach oben

Beitragvon m.fuchs » 6. Mär 2018, 10:15 Re: Version des Programm's auslesen

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
m.fuchs
 
Beiträge: 1963
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon willi4willi » 6. Mär 2018, 20:15 [gelöst] Re: Version des Programm's auslesen

Das funktioniert so einwandfrei.

Danke!
Viele Grüße

Willi4Willi

------------
willi4willi
 
Beiträge: 106
Registriert: 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows (10), Linux (debinan) / FPC 3.0.4 / Lazarus 1.8.4 | 
CPU-Target: i386, win64, arm
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried