Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Versionsinformationen von EXE-Dateien synchronisieren (https://www.delphipraxis.net/133543-versionsinformationen-von-exe-dateien-synchronisieren.html)

Exceeder 4. Mai 2009 11:43


Versionsinformationen von EXE-Dateien synchronisieren
 
Hallo,

mit einer Funktion wie der folgenden kann man ja die Versionsinformationen einer EXE oder DLL auslesen:

Delphi-Quellcode:
function ReadVersionInfo(const Filename: string): string;
type
  T2Words = record
    case Boolean of
      True: (C: Cardinal);
      False: (Lo, Hi: Word);
  end;

var
  size: Cardinal;
  p, vs: Pointer;
  MS, LS: T2Words;

begin
  Result := '';
  size := GetFileVersionInfoSize(PChar(Filename), size);

  if size > 0 then
  begin
    GetMem(p, size);
    GetFileVersionInfo(PChar(Filename), 0, size, p);
    VerQueryValue(p, '\', vs, size);

    with TVSFixedFileInfo(vs^) do
    begin
      MS.C := dwFileVersionMS;
      LS.C := dwFileVersionLS;
      Result := Format('%d.%d.%d.%d', [MS.Hi, MS.Lo, LS.Hi, LS.Lo])
    end;

    FreeMem(p);
  end;
end;
Weiß jemand wie die Updateresource Funktion zu verwenden ist, um eben diese Werte in einer EXE-Datei wieder zu schreiben? Ich habe ehrlich gesagt keine Ahnung, wie ich die Funktion verwenden soll, um die Versionsinformationen zu schreiben. In der MSDN wird leider nur erklärt, wie man Dialogressourcen kopiert..

Ich habe dazu auch das folgende Thema gefunden: http://www.delphipraxis.net/internal...ct.php?t=53954 Leider wird die Lösung dort nicht publiziert.

Hintergrund ist folgender: Ich habe mehrere EXE-Dateien welche zum Programm gehören. Nun möchte ich die Versionsinformationen entsprechend Synchronisieren, damit mein Programm nach außen geschlossen unter der gleichen Versionsnummer und Buildnummer auftritt. Dazu wäre natürlich ein Tool recht praktisch, welche auf Knopfdruck die Versionsinfos updated. Any Ideas?

Exceeder

jbg 4. Mai 2009 11:49

Re: Versionsinformationen von EXE-Dateien synchronisieren
 
Wenn du nur Delphi Projekte hast und kein Kommandozeilen-Tool nutzen musst, dann wäre mein DDevExtensions IDE Plugin vielleicht hilfreich.

http://andy.jgknet.de/blog/wp-conten...ersioninfo.png

Exceeder 4. Mai 2009 12:23

Re: Versionsinformationen von EXE-Dateien synchronisieren
 
Hallo,

es ist leider auch eine DLL- und EXE-Datei dabei, welche nicht mit Delphi erzeugt werden. Der Weg funktioniert so also leider nicht mehr DDevExtensions. Ich denke aber doch, dass das ganze mit UpdateResource prinzipiell irgendwie möglich sein müsste, oder?

Exceeder

Fridolin Walther 5. Mai 2009 18:28

Re: Versionsinformationen von EXE-Dateien synchronisieren
 
Hab jetzt nicht explizit nach Delphi Implementationen gesucht, aber hier gibts ein Tutorial wie sowas in C/C++ zu lösen ist inkl. Source:

http://www.codeproject.com/KB/cpp/UpdateVersion.aspx

Exceeder 6. Mai 2009 08:04

Re: Versionsinformationen von EXE-Dateien synchronisieren
 
Hallo nochmal,

ich bin mittlerweile einen entscheidenden Schritt weiter:

Delphi-Quellcode:
function WriteVersionInfo(const FileName: string; Major, Minor, Release, Build: Word): Boolean;
type
  VS_VERSIONINFO = packed record
    wLength: Word;
    wValueLength: Word;
    wType: Word;
    szKey: array[0..15] of WideChar;
    Padding1: Word;
    Value: VS_FIXEDFILEINFO;
    Padding2: Word;
    Children: Word;
  end;

var
  lHLib: Cardinal;
  lHRes: Cardinal;
  lHResLoad: Cardinal;
  lPResLock: Pointer;
  lSz: Cardinal;
  lPVersionInfo: ^VS_VERSIONINFO;
  lPt: Pointer;
  lHResUpd: Cardinal;

begin
  Result := False;

  if FileExists(FileName) then
  begin
    lHLib := LoadLibrary(PChar(FileName));

    if lHLib <> 0 then
    begin
      lPt := nil;
      lSz := 0;

      try
        lHRes := FindResource(lHLib, MakeIntResource(1), RT_VERSION);

        if lHRes <> 0 then
        begin
          lHResLoad := LoadResource(lHLib, lHRes);
          lSz := SizeofResource(lHLib, lHRes);

          if lHResLoad <> 0 then
          begin
            lPResLock := LockResource(lHResLoad);
            GetMem(lPt, lSz);
            Move(lPResLock^, lPt^, lSz);
          end;
        end;
      finally
        FreeLibrary(lHLib);
      end;

      if Assigned(lPt) then    
      try
        lPVersionInfo := lPt;
        lPVersionInfo^.Value.dwFileVersionMS := (Major shl 16) or Minor;
        lPVersionInfo^.Value.dwFileVersionLS := (Release shl 16) or Build;
        lPVersionInfo^.Value.dwProductVersionMS := lPVersionInfo^.Value.dwFileVersionMS;
        lPVersionInfo^.Value.dwProductVersionLS := lPVersionInfo^.Value.dwFileVersionLS;

        lHResUpd := BeginUpdateResource(PChar(FileName), False);

        if lHResUpd <> 0 then
        begin
          try
            Result := UpdateResource(lHResUpd, RT_VERSION, MakeIntResource(1), 0, lPt, lSz);
          finally
            EndUpdateResource(lHResUpd, not Result);
          end;
        end;
      finally
        FreeMem(lPt);
      end;
    end;
  end;
end;
Das ganze funktioniert auch soweit für die FileVersion, allerdings scheint die ProductVersion damit nicht geupdated zu werden. Jemand eine Idee was da noch falsch laufen könnte?

Exceeder


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz