AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Versionsinformationen von EXE-Dateien synchronisieren
Thema durchsuchen
Ansicht
Themen-Optionen

Versionsinformationen von EXE-Dateien synchronisieren

Ein Thema von Exceeder · begonnen am 4. Mai 2009 · letzter Beitrag vom 6. Mai 2009
Antwort Antwort
Exceeder

Registriert seit: 29. Mai 2006
24 Beiträge
 
#1

Versionsinformationen von EXE-Dateien synchronisieren

  Alt 4. Mai 2009, 12:43
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
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: Versionsinformationen von EXE-Dateien synchronisieren

  Alt 4. Mai 2009, 12:49
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
  Mit Zitat antworten Zitat
Exceeder

Registriert seit: 29. Mai 2006
24 Beiträge
 
#3

Re: Versionsinformationen von EXE-Dateien synchronisieren

  Alt 4. Mai 2009, 13:23
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
  Mit Zitat antworten Zitat
Fridolin Walther

Registriert seit: 11. Mai 2008
Ort: Kühlungsborn
446 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Versionsinformationen von EXE-Dateien synchronisieren

  Alt 5. Mai 2009, 19:28
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
Fridolin Walther
  Mit Zitat antworten Zitat
Exceeder

Registriert seit: 29. Mai 2006
24 Beiträge
 
#5

Re: Versionsinformationen von EXE-Dateien synchronisieren

  Alt 6. Mai 2009, 09:04
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:39 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