Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Sonstiges (https://www.delphipraxis.net/45-library-sonstiges/)
-   -   Delphi Versionsinformationen einer EXE- oder DLL-Datei abfragen (https://www.delphipraxis.net/74080-versionsinformationen-einer-exe-oder-dll-datei-abfragen.html)

faux 27. Jul 2006 19:16


Versionsinformationen einer EXE- oder DLL-Datei abfragen
 
Hallo!

Habe hier in der DP mal vor längerer Zeit diesen Code gefunden, weiß aber leider nicht mehr von wem dieser ist. Damit kann man die Versionsinformation von EXE- oder DLL-Dateien auslesen. Habe diesen Code etwas angepasst:

Delphi-Quellcode:
uses
  Windows;

type
  // 1: Major, 2: Minor, 3: Release, 4: Build
  TFileVersion = array [1..4] of Smallint;

function GetVersion(FileName: string): TFileVersion;
var
  VerInfoSize, VerValueSize, Dummy: DWord;
  VerInfo: Pointer;
  VerValue: PVSFixedFileInfo;
begin
  // Länge der Dateiinformationen bekommen.
  VerInfoSize := GetFileVersionInfoSize(PChar(FileName), Dummy);
  // Speicherplatz reservieren.
  GetMem(VerInfo, VerInfoSize);
  // Dateiinformationen selektieren.
  GetFileVersionInfo(PChar(FileName), 0, VerInfoSize, VerInfo);
  // Prüfen ob Dateiinformationen vorhanden
  if VerInfo <> nil then
  begin
    // Dateiinformationen auslesen.
    VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
    // Version auslesen und zurückgeben.
    with VerValue^ do
    begin
      // Major
      Result[1] := dwFileVersionMS shr 16;
      // Minor
      Result[2] := dwFileVersionMS and $FFFF;
      // Release
      Result[3] := dwFileVersionLS shr 16;
      // Build
      Result[4] := dwFileVersionLS and $FFFF;
    end;
  end;
  // Speicher freigeben (Dateiinformationen).
  FreeMem(VerInfo, VerInfoSize);
end;
Grüße
Faux

Luckie 27. Jul 2006 20:08

Re: Versionsinformationen einer EXE- oder DLL-Datei abfragen
 
Ich würde es so machen:
Delphi-Quellcode:
function GetVersion(FileName: string; var Major, Minor, Release, Build: DWORD): DWORD;
var
  VerInfoSize, VerValueSize, Dummy: DWord;
  VerInfo          : Pointer;
  VerValue         : PVSFixedFileInfo;
  err              : DWORD;
begin
  err := 0;
  VerInfoSize := GetFileVersionInfoSize(PChar(FileName), Dummy);
  if VerInfoSize <> 0 then
  begin
    GetMem(VerInfo, VerInfoSize);
    try
      GetFileVersionInfo(PChar(FileName), 0, VerInfoSize, VerInfo);
      if VerInfo <> nil then
      begin
        if VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize) then
        begin
          with VerValue^ do
          begin
            Major := dwFileVersionMS shr 16;
            Minor := dwFileVersionMS and $FFFF;
            Release := dwFileVersionLS shr 16;
            Build := dwFileVersionLS and $FFFF;
          end;
        end
        else
          err := GetLastError;
      end;
    finally
      FreeMem(VerInfo, VerInfoSize);
    end;
  end
  else
    err := GetLastError;
  result := err;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Major, Minor, Release, Build: DWORD;
  err: DWORD;
  s: String;
begin
  err := GetVersion(ParamStr(0), Major, Minor, Release, Build);
  if err <> 0 then
    s := SysErrorMessage(err)
  else
    s := Format('%d.%d.%d.%d', [major, Minor, Release, Build]);
  ShowMessage(s);
end;

Matze 4. Jan 2007 09:01

Re: Versionsinformationen einer EXE- oder DLL-Datei abfragen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Von himitsu kommt folgende Version mit dem Zusatz, dass angezeigt wird, um welche Art der Version es sich handelt.

z.B.:

debug = Fehlersuche
beta = Testversion
private = Privates Build
special = Spezielles Build

Für die Datei (EXE/DLL) - meist das eigene Programm:

Delphi-Quellcode:
Function GetFileVersion: String;
  Var i, W: LongWord;
    P: Pointer;
    FI: PVSFixedFileInfo;

  Begin
    Result := 'NoVersionInfo';
    i := GetFileVersionInfoSize(PChar(ParamStr(0)), W);
    If i = 0 Then Exit;
    GetMem(P, i);
    Try
      If not GetFileVersionInfo(PChar(ParamStr(0)), W, i, P)
        or not VerQueryValue(P, '\', Pointer(FI), W) Then Exit;
      Result := IntToStr(FI^.dwFileVersionMS shr 16)
        + '.' + IntToStr(FI^.dwFileVersionMS and $FFFF)
        + '.' + IntToStr(FI^.dwFileVersionLS shr 16)
        + '.' + IntToStr(FI^.dwFileVersionLS and $FFFF);
      If FI^.dwFileFlags and VS_FF_DEBUG       <> 0 Then Result := Result + ' debug';
      If FI^.dwFileFlags and VS_FF_PRERELEASE  <> 0 Then Result := Result + ' beta';
      If FI^.dwFileFlags and VS_FF_PRIVATEBUILD <> 0 Then Result := Result + ' private';
      If FI^.dwFileFlags and VS_FF_SPECIALBUILD <> 0 Then Result := Result + ' special';
    Finally
      FreeMem(P);
    End;
  End;
Und wer es für andere Dateien braucht:

Delphi-Quellcode:
Function GetFileVersion(Const FileName: String): String;
  Var i, W: LongWord;
    P: Pointer;
    FI: PVSFixedFileInfo;

  Begin
    Result := 'NoVersionInfo';
    i := GetFileVersionInfoSize(PChar(FileName), W);
    If i = 0 Then Exit;
    GetMem(P, i);
    Try
      If not GetFileVersionInfo(PChar(FileName), W, i, P)
        or not VerQueryValue(P, '\', Pointer(FI), W) Then Exit;
      Result := IntToStr(FI^.dwFileVersionMS shr 16)
        + '.' + IntToStr(FI^.dwFileVersionMS and $FFFF)
        + '.' + IntToStr(FI^.dwFileVersionLS shr 16)
        + '.' + IntToStr(FI^.dwFileVersionLS and $FFFF);
      If FI^.dwFileFlags and VS_FF_DEBUG       <> 0 Then Result := Result + ' debug';
      If FI^.dwFileFlags and VS_FF_PRERELEASE  <> 0 Then Result := Result + ' beta';
      If FI^.dwFileFlags and VS_FF_PRIVATEBUILD <> 0 Then Result := Result + ' private';
      If FI^.dwFileFlags and VS_FF_SPECIALBUILD <> 0 Then Result := Result + ' special';
    Finally
      FreeMem(P);
    End;
  End;
PS: GetFileVersion(ParamStr(0)), oder GetFileVersion(Application.ExeName) geben das selbe wie der erste Code zurück :zwinker:

Die im Bild rosa markierten Felder werden genutzt
und wenn keine VersionsInfo vorhanden ist, dann kommt der erste String ('NoVersionInfo') raus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:08 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