AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Versionsinfo auslesen?

Ein Thema von Borschti · begonnen am 9. Apr 2008 · letzter Beitrag vom 18. Mai 2017
Antwort Antwort
Seite 1 von 2  1 2      
Borschti

Registriert seit: 1. Nov 2007
Ort: Marburg Lahn
235 Beiträge
 
Delphi 2007 Professional
 
#1

Versionsinfo auslesen?

  Alt 9. Apr 2008, 16:55
Hi,

Ich möchte die Infodatei meines Delphi Programms von Projekt --> Optionen --> Versionsinformationen auslesen, dazu habe Ich in der CodeLib diesen Code von Luckie gefunden:

Delphi-Quellcode:
function GetFileInfo(
  var aInternalName, aFileVersion: String; FileName: AnsiString
): Boolean;
var
  VersionInfoSize, VerInfoSize, GetInfoSizeJunk: DWORD;
  VersionInfo, Translation, InfoPointer: Pointer;
  VersionValue: AnsiString;
begin
  Result := False;
  VerInfoSize := GetFileVersionInfoSize(PChar(FileName), GetInfoSizeJunk);
  if VerInfoSize > 0 then
  begin
    GetMem(VersionInfo, VerInfoSize);
    try
      GetFileVersionInfo(PChar(FileName), 0, VerInfoSize, VersionInfo);
      VerQueryValue(
        VersionInfo, '\\VarFileInfo\\Translation', Translation, VerInfoSize
      );
      VersionValue :=
        '\\StringFileInfo\\' + IntToHex(LoWord(LongInt(Translation^)), 4) +
        IntToHex(HiWord(LongInt(Translation^)), 4) + '\\';
      VersionInfoSize := 0;

      VerQueryValue(
        VersionInfo, PChar(VersionValue + 'InternalName'), InfoPointer,
        VersionInfoSize
      );
      aInternalName := AnsiString(PChar(InfoPointer));

      VerQueryValue(
        VersionInfo, PChar(VersionValue + 'FileVersion'), InfoPointer,
        VersionInfoSize
      );
      aFileVersion := AnsiString(PChar(InfoPointer));

    finally
      FreeMem(VersionInfo);
    end;
    aInternalName := Trim(aInternalName);
    aFileVersion := Trim(aFileVersion);
    Result := (aInternalName <> '') and (aFileVersion <> '');
  end;
end;
Nun verstehe Ich nicht welche Parameter Ich der Funktion übergeben muss und wo dann die Versionsinfos dann gepeichert werden, weil die Funktion gibt einen Wert vom Typ Boolean zurück. Wie kann Ich also die erhaltenen Informationen dann irgendwo anzeigen lassen und welche Parameter müssen übergeben werden, Ich kann mit denen im Funktionskopf stehenden nicht viel anfangen

Schonmal danke für die Antworten.

mfg
Alex
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

Re: Versionsinfo auslesen?

  Alt 9. Apr 2008, 17:27
Hallo, ich verwende immer diese Funktion:
Delphi-Quellcode:
function GetCurrentVersion: String;
var
  VerInfoSize: DWORD;
  VerInfo: Pointer;
  VerValueSize: DWORD;
  VerValue: PVSFixedFileInfo;
  Dummy: DWORD;
begin
  VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);
  GetMem(VerInfo, VerInfoSize);
  GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
  VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
  with VerValue^ do begin
    Result := 'Version '+IntToStr(dwFileVersionMS shr 16);
    Result := Result + '.' + IntToStr(dwFileVersionMS and $FFFF);
    Result := Result + '.' + IntToStr(dwFileVersionLS shr 16);
  end;
  FreeMem(VerInfo, VerInfoSize);
end;
Sie liefert einen String, der die Version enthält und funktioniert eigentlich in allen Delphi-Versionen ab 6.
Man muss natürlich in den Projectoptionen auch die Versionsangabe freischalten, sonst wirft die Function nen Error.
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

Re: Versionsinfo auslesen?

  Alt 9. Apr 2008, 17:46
zu Luckies Code:

Delphi-Quellcode:
function GetFileInfo(
  var aInternalName, aFileVersion: String; FileName: AnsiString
): Boolean;
Also, ich hab mir die Methode nicht angeschaut, aber folgendes lässt sich sagen. Es sind zwei var-Paramter vorhanden. Das ist die eigentlich Ausgabe, d.h. aInternalName und aFileVersion werden zurückgegeben. Des weiteren musst du den Dateinamen (inkl. Pfad denke ich, in so fern die Datei in einem anderen Verzeichnis befindet als im Ausführungsverzeichnis) der Datei übergeben, von welcher du die Informationen haben willst. Als Rückgabe bekommst du einen Wert vom Typ Boolean, also, ob die Anfrage überhaupt funktioniert hat oder nicht.

Ein Aufruf kann wie folgt aussehen:
Delphi-Quellcode:
// in deiner Methode...
var
  internal_name : String;
  version : String;
begin
  // ...
  // Dein Code
  // ...

  // Hier werden internal_name und version überschrieben,
  // eben mit den Werten die aus der Datei kommen
  if (not GetFileInfo(internal_name, version, Application.ExeName)) then
  begin
    // Version und InternalName konnten NICHT ausgelesen werden
  end
  else
    // Anzeige der Version
    showMessage('Programmversion: ' + version);

  // ...
  // Dein Code
  // ...
end;
Wenn du das ganze in eine Klasse eingearbeitet haben willst, dann kann ich sie dir gerne zur Verfügung stellen. Schickst mir einfach eine PN, dann stelle ich sie hier online. Dort werden auch noch weit mehr Informationen ausgelesen.

Mit freundlichen Grüßen
der Hai
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Borschti

Registriert seit: 1. Nov 2007
Ort: Marburg Lahn
235 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Versionsinfo auslesen?

  Alt 10. Apr 2008, 09:02
Ah ok, jetzt wirds doch ein wenig klarer Ich habe mal Progmans Vorschlag übernommen aber werde Luckies Code auch noch mal ausprobieren

Also das mit der Versionsnummer klappt schonmal Wunderbar, Ich würde nur gerne noch den in der Datei angegebenen Firmennamen ausgeben. Wie könnte ich das möglichst einfach zu dem bestehenden Code anfügen?

Noch danke für doe Hilfreichen Antworten.

mfg
Alex
  Mit Zitat antworten Zitat
soulies

Registriert seit: 9. Dez 2005
234 Beiträge
 
#5

Re: Versionsinfo auslesen?

  Alt 10. Apr 2008, 10:23
versuchs mal damit :

Delphi-Quellcode:
 function GetFileInfo( var aInternalName, aFileVersion, aCompanyname: String; FileName: AnsiString): Boolean;
 ...
    VerQueryValue(
        VersionInfo, PChar(VersionValue + 'Companyname'), InfoPointer,
        VersionInfoSize
      );
      aCompanyname := AnsiString(PChar(InfoPointer));
  ...
und in deinem aufruf dann

Delphi-Quellcode:
 procedure ...
 var
    i_name, version, company : string ;
 begin
    GetFileInfo(i_name,version,company,[Pfad]);
    ...
 end;

cya
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#6

Re: Versionsinfo auslesen?

  Alt 10. Apr 2008, 11:26
Ich hänge einfach mal die Klasse an, mit welcher ich das immer löse. Damit solltest du an recht viele Informationen eine Exe (evtl. auch DLL?) kommen.

PS: Die Methode zum Auslesen ist (leider) nicht auf meinem Mist gewachsen, nur weiß ich auch nicht mehr woher ich den Code habe
Angehängte Dateien
Dateityp: pas classtexeinformation_544.pas (12,0 KB, 303x aufgerufen)
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Borschti

Registriert seit: 1. Nov 2007
Ort: Marburg Lahn
235 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Versionsinfo auslesen?

  Alt 10. Apr 2008, 12:37
Danke für eure zahlreichen Antworten, hat auf anhieb geklappt mit soulies lösung. und jetzt weiß ich wie Ich auch andere Inhalte aus der Info auslesen kann, danke.

mfg
Alex
  Mit Zitat antworten Zitat
Nostromo1111

Registriert seit: 5. Mai 2007
3 Beiträge
 
#8

AW: Re: Versionsinfo auslesen?

  Alt 14. Mär 2012, 10:14
Hallo, ich verwende immer diese Funktion:
Delphi-Quellcode:
function GetCurrentVersion: String;
var
  VerInfoSize: DWORD;
  VerInfo: Pointer;
  VerValueSize: DWORD;
  VerValue: PVSFixedFileInfo;
  Dummy: DWORD;
begin
  VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);
  GetMem(VerInfo, VerInfoSize);
  GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
  VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
  with VerValue^ do begin
    Result := 'Version '+IntToStr(dwFileVersionMS shr 16);
    Result := Result + '.' + IntToStr(dwFileVersionMS and $FFFF);
    Result := Result + '.' + IntToStr(dwFileVersionLS shr 16);
  end;
  FreeMem(VerInfo, VerInfoSize);
end;
Sie liefert einen String, der die Version enthält und funktioniert eigentlich in allen Delphi-Versionen ab 6.
Man muss natürlich in den Projectoptionen auch die Versionsangabe freischalten, sonst wirft die Function nen Error.
Und in Delphi 7 hat man 4 stellige Versionen. Daher kann man ab Delphi 7 noch folgende letzte Result-Zeile hinzufügen:

Result := Result + '.' + IntToStr(dwFileVersionLS and $FFFF);

Nur zur Info. Beitrag ist schon alt, aber einer der ersten die einem über Google ins Auge fallen.
  Mit Zitat antworten Zitat
matze8426
(Gast)

n/a Beiträge
 
#9

AW: Re: Versionsinfo auslesen?

  Alt 18. Mai 2017, 01:36
Hallo zusammen,

funktioniert der folgende Code auch mit Delphi 10 Tokyo? Welche Units muss ich einbinden? Über Refactoring Unit suchen habe ich WinApi.Windows hinzugefügt.
Aber GetFileVersionInfo oder z.B. GetMem findet er nicht. Laut der Hilfe gibt es die Funktion GetFileVersionInfo auch nicht, aber GetFileVersion. Aber auch die wird als undeklarierter Bezeichner angemeckert...
Hallo, ich verwende immer diese Funktion:
Delphi-Quellcode:
function GetCurrentVersion: String;
var
  VerInfoSize: DWORD;
  VerInfo: Pointer;
  VerValueSize: DWORD;
  VerValue: PVSFixedFileInfo;
  Dummy: DWORD;
begin
  VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);
  GetMem(VerInfo, VerInfoSize);
  GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
  VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
  with VerValue^ do begin
    Result := 'Version '+IntToStr(dwFileVersionMS shr 16);
    Result := Result + '.' + IntToStr(dwFileVersionMS and $FFFF);
    Result := Result + '.' + IntToStr(dwFileVersionLS shr 16);
  end;
  FreeMem(VerInfo, VerInfoSize);
end;
Sie liefert einen String, der die Version enthält und funktioniert eigentlich in allen Delphi-Versionen ab 6.
Man muss natürlich in den Projectoptionen auch die Versionsangabe freischalten, sonst wirft die Function nen Error.
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
760 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Versionsinfo auslesen?

  Alt 18. Mai 2017, 07:09
Hallo matze8426

GetFileVersionInfo und VerQueryValue findest du auch in Tokyo in der Winapi.Windows - und sie funktionieren .

GetMem findest du in der unit system.

Der erste Parameter von GetFileVersionInfo ist vom Typ PWideChar und nicht PChar. (Edit: Ist natürlich Mist - PChar geht auch )

Nebenbei:
Eventuell solltest du raus springen bei folgenden Rückgabewerten: VerInfoSize=0, GetFileVersionInfo=false oder VerQueryValue=false. Mit deiner function GetCurrentVersion kannst du auch die VersionsInfos anderer Files abfragen; wieso also nicht function GetFileVersion(const filename: string): string; - du musst nur if not GetFileVersionInfo(PWideChar(filename),... anpassen.

Gruss
Michael
Michael Gasser

Geändert von Michael II (18. Mai 2017 um 11:23 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz