Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Versionsinfo auslesen? (https://www.delphipraxis.net/111803-versionsinfo-auslesen.html)

Borschti 9. Apr 2008 15:55


Versionsinfo auslesen?
 
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

Progman 9. Apr 2008 16:27

Re: Versionsinfo auslesen?
 
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.

s.h.a.r.k 9. Apr 2008 16:46

Re: Versionsinfo auslesen?
 
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 ;)

Borschti 10. Apr 2008 08:02

Re: Versionsinfo auslesen?
 
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

soulies 10. Apr 2008 09:23

Re: Versionsinfo auslesen?
 
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

s.h.a.r.k 10. Apr 2008 10:26

Re: Versionsinfo auslesen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
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 :oops:

Borschti 10. Apr 2008 11:37

Re: Versionsinfo auslesen?
 
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

Nostromo1111 14. Mär 2012 09:14

AW: Re: Versionsinfo auslesen?
 
Zitat:

Zitat von Progman (Beitrag 761959)
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.

matze8426 18. Mai 2017 00:36

AW: Re: Versionsinfo auslesen?
 
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...
Zitat:

Zitat von Progman (Beitrag 761959)
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.


Michael II 18. Mai 2017 06:09

AW: Versionsinfo auslesen?
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 Uhr.
Seite 1 von 2  1 2      

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