AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Versionsinfo automatisch ins Programm übernehmen
Thema durchsuchen
Ansicht
Themen-Optionen

Versionsinfo automatisch ins Programm übernehmen

Ein Thema von m-werk · begonnen am 2. Aug 2002 · letzter Beitrag vom 6. Aug 2002
 
MathiasSimmack
(Gast)

n/a Beiträge
 
#16
  Alt 6. Aug 2002, 09:27
Na ja, es reicht die Unit "Windows.pas":
Code:
[b]unit[/b] FileVer;

[b]interface[/b]

[b]function[/b] GetFileVersionsString([b]const[/b] p_sFilepath : [b]string[/b]) : [b]string[/b];


[b]implementation[/b]

[b]uses[/b]
  Windows;

[color=#000080][i]//
// "frmt" (Copyright, Assarbad)
//[/i][/color]
[b]function[/b] frmt(mformat: [b]string[/b]; args: [b]array[/b] [b]of[/b] POINTER): [b]string[/b];
[b]var[/b]
  buf: [b]array[/b][0..$3ff][b]of[/b] char;
[b]begin[/b]
  ZeroMemory(@buf[0], sizeof(buf));
  wvsprintf(@buf[0], @mformat[1], pchar(@args));
  SetString(result, pchar(@buf[0]), lstrlen(@buf[0]));
[b]end[/b];


[b]const[/b] [color=#000080][i]// Das Ergebnis soll ja nett formatiert sein :)[/i][/color]
  sFixVerFormat = 'Fileversion: %d.%d.%d.%d / Productversion: %d.%d.%d.%d';

[b]function[/b] GetFileVersionsString([b]const[/b] p_sFilepath : [b]string[/b]) : [b]string[/b];
[b]var[/b]
  dwVersionSize  : DWord;           [color=#000080][i]// Buffer für die Grösse der Versionsinfo der abgefragten Datei[/i][/color]
  dwDummy        : DWord;           [color=#000080][i]// Dummy, Wert wird nicht benötigt[/i][/color]
  pVerBuf        : Pointer;         [color=#000080][i]// Buffer für die Versionsdaten[/i][/color]
  pFixBuf        : PVSFixedFileInfo; [color=#000080][i]// Buffer für die Versionsinfo fester Länge[/i][/color]
  sReqdInfo      : [b]string[/b];          [color=#000080][i]// Hier kommt rein, welcher Teil der Versionsinfo abgefragt werden soll[/i][/color]
[b]begin[/b]
  [color=#000080][i]// Annahme: Die Datei hat keine Versionsinfo[/i][/color]
  Result       := frmt(sFixVerFormat,
    [POINTER(0),POINTER(0),POINTER(0),POINTER(0),
     POINTER(0),POINTER(0),POINTER(0),POINTER(0)]);

  dwDummy      := 0;  [color=#000080][i]// Dummy initialisieren[/i][/color]
  sReqdInfo    := '\'; [color=#000080][i]// Es soll die Versionsinfo fester Länge abgefragt werden

  // Mal sehen, wieviel Platz die Versionsinfo der Datei braucht[/i][/color]
  dwVersionSize := GetFileVersionInfoSize(PChar(p_sFilepath),dwDummy);
  [b]if[/b] dwVersionSize > 0 [b]then[/b] [color=#000080][i]// Wenn > 0, dann Versionsinfo vorhanden[/i][/color]
    [b]try[/b]
      GetMem(pVerBuf,dwVersionSize); fillchar(pVerBuf^,dwVersionSize,0);

      [color=#000080][i]// Gesamte Versionsinformationen auslesen[/i][/color]
      [b]if[/b] GetFileVersionInfo(PChar(p_sFilepath),0,dwVersionSize,pVerBuf) [b]then[/b]
        [b]begin[/b] [color=#000080][i]// Werte für Versionsinfo fester Länge extrahieren[/i][/color]
          [b]if[/b] VerQueryValue(pVerBuf,PChar(sReqdInfo),Pointer(pFixBuf),dwDummy) [b]then[/b]
            [b]begin[/b]
              [color=#000080][i]// und als Ergebnis ausgeben[/i][/color]
              Result := frmt(sFixVerFormat,
                [POINTER((pFixBuf^.dwFileVersionMS [b]and[/b] $FFFF0000) [b]shr[/b] 16),
                 POINTER(pFixBuf^.dwFileVersionMS [b]and[/b] $0000FFFF),
                 POINTER((pFixBuf^.dwFileVersionLS [b]and[/b] $FFFF0000) [b]shr[/b] 16),
                 POINTER(pFixBuf^.dwFileVersionLS [b]and[/b] $0000FFFF),
                 POINTER((pFixBuf^.dwProductVersionMS [b]and[/b] $FFFF0000) [b]shr[/b] 16),
                 POINTER(pFixBuf^.dwProductVersionMS [b]and[/b] $0000FFFF),
                 POINTER((pFixBuf^.dwProductVersionLS [b]and[/b] $FFFF0000) [b]shr[/b] 16),
                 POINTER(pFixBuf^.dwProductVersionLS [b]and[/b] $0000FFFF)]);
        [b]end[/b];
      [b]end[/b];
    [b]finally[/b] [color=#000080][i]// Resourcen wieder freigeben[/i][/color]
      FreeMem(pVerBuf,dwVersionSize);
    [b]end[/b];
[b]end[/b];

[b]end[/b].
Das Einbinden der Unit und Benutzen der Funktion sollte wohl keine größeren Probleme machen, m-werk. Ich würde generell diesen Weg über eine extra Unit vorziehen, denn wenn du die Funktion vielleicht auch in einem anderen Programm verwenden willst, dann fängst du an, erst mal alles aus dem Quellcode herauszukopieren. So nimmst du einfach nur die Unit, und fertig.

Interessanter Nebeneffekt: benutzt man die Einstellungen von Delphi bezüglich Datei- und Produktversion, ist der Wert in beiden Fällen identisch. In meinen Projektoptionen steht z.B. als Dateiversion 1.2.7.548 und als Produktversion 1.2.7.0. Es wird aber beide Male die Dateiversion angezeigt.
Benutze ich aber eine Ressourcendatei mit Versionsangaben, wird sowohl die Dateiversion als auch die (diesmal richtige) Produktversion dargestellt.
  Mit Zitat antworten Zitat
 


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 06:38 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