Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Versionsinfo automatisch ins Programm übernehmen (https://www.delphipraxis.net/505-versionsinfo-automatisch-ins-programm-uebernehmen.html)

m-werk 2. Aug 2002 09:38


Versionsinfo automatisch ins Programm übernehmen
 
Hi, noch ne Frage!

Wenn ich bei meinem Projekt bei den Projektopitionen unter Versionsinfo einen neuen Wert eingebe, kann ich dann im Programm irgendwie darauf zugreifen, so dass dann im Programm bei Version auch dieser Wert steht, damit ich nicht immer manuell die Versionsinfo eintragen muß?

Wenn ja, wie kann ich das anstellen?

sakura 2. Aug 2002 12:43

Hi m-werk,

in folgendem Thread habe ich mal ein Beispiel dafür gegeben. Vielleicht hilfts weiter ;)

http://www.delphipraxis.de/viewtopic.php?t=242

Luckie 5. Aug 2002 19:52

Einfach kopieren und ohne nachdenken benutzen:
Code:
function GetFileVersionsString(const p_sFilepath : string) : string;

const // Das Ergebnis soll ja nett formatiert sein :)
  sFixVerFormat = 'Fileversion: %d.%d.%d.%d / Productversion: %d.%d.%d.%d';

var
  dwVersionSize  : DWord;           // Buffer für die Grösse der Versionsinfo der abgefragten Datei
  dwDummy        : DWord;           // Dummy, Wert wird nicht benötigt
  pVerBuf        : Pointer;         // Buffer für die Versionsdaten
  pFixBuf        : PVSFixedFileInfo; // Buffer für die Versionsinfo fester Länge
  sReqdInfo      : string;          // Hier kommt rein, welcher Teil der Versionsinfo abgefragt werden soll

begin
  // Annahme: Die Datei hat keine Versionsinfo
  Result       := Format(sFixVerFormat,[0,0,0,0,0,0,0,0]);
  dwDummy      := 0;  // Dummy initialisieren
  sReqdInfo    := '\'; // Es soll die Versionsinfo fester Länge abgefragt werden
  // Mal sehen, wieviel Platz die Versionsinfo der Datei braucht
  dwVersionSize := GetFileVersionInfoSize(PChar(p_sFilepath),dwDummy);
  if dwVersionSize > 0 then
  begin // Wenn > 0, dann Versionsinfo vorhanden
    try
      pVerBuf := AllocMem(dwVersionSize); // Buffer initialisieren
      // Gesamte Versionsinformationen auslesen
      if GetFileVersionInfo(PChar(p_sFilepath),0,dwVersionSize,pVerBuf) then
      begin // Werte für Versionsinfo fester Länge extrahieren
        if VerQueryValue(pVerBuf,PChar(sReqdInfo),Pointer(pFixBuf),dwDummy) then
        begin
          // und als Ergebnis ausgeben
          Result := Format(sFixVerFormat,[
            (pFixBuf^.dwFileVersionMS and $FFFF0000) shr 16, // 1. Stelle HiWord, deshalb nach unten schieben
            pFixBuf^.dwFileVersionMS and $0000FFFF,
            (pFixBuf^.dwFileVersionLS and $FFFF0000) shr 16,
            pFixBuf^.dwFileVersionLS and $0000FFFF,
            (pFixBuf^.dwProductVersionMS and $FFFF0000) shr 16,
            pFixBuf^.dwProductVersionMS and $0000FFFF,
            (pFixBuf^.dwProductVersionLS and $FFFF0000) shr 16,
            pFixBuf^.dwProductVersionLS and $0000FFFF
           ]);
        end;
      end;
    finally // Resourcen wieder freigeben
      FreeMem(pVerBuf,dwVersionSize);
    end;
  end;
end;

MathiasSimmack 5. Aug 2002 20:27

Zitat:

Zitat von m-werk
Hi, leider hat mir der Beitrag nicht weitergeholfen.

Eigentlich unverständlich, IMHO.

Zitat:

Ich möchte das ganz einfach gestallten.
Es ist ganz einfach, weil Luckies Funktion einen fertigen, formatierten String zurückliefert. Vielleicht gefällt dir die Art der Formatierung dieses Strings nicht, beispielsweise:
Code:
Fileversion: 3.0.0.13 / Productversion: 3.0.0.0
Aber es spricht ja nichts dagegen, die Felder zu entfernen, die du höchstwahrscheinlich nicht brauchst. Als Vorschlag:
Code:
[b]const[/b] [i]// Das Ergebnis bleibt nett ;o)[/i]
  sFixVerFormat = '%d.%d.%d.%d';

[i]{ ... }

// und als Ergebnis ausgeben [/i]
Result := Format(sFixVerFormat,[ 
  (pFixBuf^.dwFileVersionMS [b]and[/b] $FFFF0000) [b]shr[/b] 16,
   pFixBuf^.dwFileVersionMS [b]and[/b] $0000FFFF,
  (pFixBuf^.dwFileVersionLS [b]and[/b] $FFFF0000) [b]shr[/b] 16,
   pFixBuf^.dwFileVersionLS [b]and[/b] $0000FFFF]);
Damit liefert die selbe Funktion nur noch die Dateiversion als String zurück.

Zitat:

Ich habe ein Label wo die Version drinn steht. Dieses Label möchte ich immer aktalisiert haben, wenn ich es im Programm erhöhe! Geht das auch einfach mit einem kleinen Code?
Diesen String kannst du an die Caption des Labels weitergeben. Es ist ja nicht so, dass man die Beschriftung nur einmal ändern kann. Oder?

In diesem Sinne, das letzte Wort hat Luckie:
Zitat:

Einfach kopieren und ohne nachdenken benutzen
Obwohl Nachdenken manchmal ganz gut ist. :wink:

Christian Seehase 5. Aug 2002 20:27

Moin Luckie,

der Code kommt mir so bekannt vor :mrgreen:

@m-werk:
Du musst doch nur die Funktion kopieren und aufrufen:

Code:
Label.Caption := GetFileVersionsString(paramstr(0));
fertig.

Sollte Dir das Ergebnis zu lang sein, dann schau Dir doch mal die Hilfe zu der Funktion Format an. Damit sollte es dann hinzubekommen sein, in der Funktion GetFileVerionsString den Rückgabewert auf das gewünscht Mass zu reduzieren.

MathiasSimmack 5. Aug 2002 20:28

Interessant. Jetzt ist meine Antwort vor m-werks Posting.
Ich bin ein Hellseher. :twisted:

Daniel, Forum reparieren!


<Edit>
@Chris: Ätsch, ich war schneller ... und auch gehässiger ... :wink:
</Edit>

Daniel 5. Aug 2002 20:32

Dies ist leider einer der Threads, die von der Zeitumstellung des Servers betroffen sind. Durch die zweimalige Zeitumstellung sind die Beiträge jetzt in der falschen Reihenfolge. Da kann ich leider nichts machen; ab morgen früh (04:00 Uhr) wird wieder alles im Lot sein. (Dafür haben wir derzeit Beiträge aus der Zukunft :wink:)

Sorry,
Daniel
Delphi-PRAXiS Administrator

Christian Seehase 5. Aug 2002 20:36

Moin Mathias,

Code:
Ätsch, ich war schneller ...
wenn mich die Software nicht am Posten gehindert hätte... :cry: :mrgreen:

Zitat:

und auch gehässiger ...
tja, hmm..., da macht Dir so leicht eh' keiner was vor :twisted: :mrgreen:

MathiasSimmack 5. Aug 2002 20:39

Zitat:

Zitat von Daniel
(Dafür haben wir derzeit Beiträge aus der Zukunft :wink:)

Ich merke schon. :shock:
Fassen wir zusammen, damit der Gag erhalten bleibt:

Zitat:

Zitat von MathiasSimmack
ein gehässiges Posting, verfasst am: 05.08.02, 21:27

Zitat:

Zitat von ChristianSeehase
ein netteres Posting, verfasst am: 05.08.02, 21:27

Zitat:

Zitat von m-werk
der Auslöser, verfasst am: 06.08.02, 04:13

8)


@Chris: nicht traurig sein. Ich wurde letztens als "Herr der großen Worte" bezeichnet. :wink:

Luckie 5. Aug 2002 20:39

Das hier Beiträge etwas durcheinander geraten sind, liegt wohl daran, dass sie es bei 1&1 jetzt endlich geschafft haben den Pendel wieder in gang zu bekommen, die Feder aufzuziehen und das Glöcken neu zu stimmen.

Es geht nun mal nicht mit einem Einzeiler. Lager das ganze in eine Unit aus und du siehst es nicht mehr. Hat noch den Vorteil, dass du beim nächsten Projekt diese Unit wiederverwenden kannst.

@Christian: Öhm, ja kann sein, dass sie von dir ist. Ich sammele solche Codeschnipsel, um sie bei Bedarf zur Hand zu haben ohne lange online in diversen Foren suchen zu müssen.

Luckie 5. Aug 2002 20:43

Zitat:

Zitat von MathiasSimmack
@Chris: nicht traurig sein. Ich wurde letztens als "Herr der großen Worte" bezeichnet. :wink:

War nicht böse gemeint :oops:. Der Indianername von Mathias ist ja übrigens "Flinkerfüller".

m-werk 6. Aug 2002 03:13

Hi, leider hat mir der Beitrag nicht weitergeholfen. Ich möchte das ganz einfach gestallten.

Ich habe ein Label wo die Version drinn steht. Dieses Label möchte ich immer aktalisiert haben, wenn ich es im Programm erhöhe! Geht das auch einfach mit einem kleinen Code?

m-werk 6. Aug 2002 07:13

Hi, find ich ganz witzig, wenn so beiträge früher oder später erscheinen. Aber das funktioniert jetzt glaub ich eh schon.

Die funktion: function GetFileVersionsString(const p_sFilepath : string) : string;

Wo setzte ich diese hin? Ich habe 2 Formulare wo die Informationen drinn stehen müssen.

Meiner meinung nach muß ich diese unter 'puplik' setzen.
IST DAS RICHTIG?

Luckie 6. Aug 2002 07:36

Ja, ähm kommt jetzt drauf an. Also wenn du es in zwei Formularen brauchst, der Code also in zwei Units steht, dann würde ich die Funktion in eine dritte auslagern und diese bei Uses in den anderen beiden Units (den Formular-Units) einbinden.

Wenn du dir von Delphi automatisch eine neue Unit generieren läßt, also auf neu-->Unit klickst, dann schmeiß aber bitte alle überflüssigen Units raus. Ich weiß jetzt nicht genau, was nicht gebraucht wird, aber die Unit Forms brauchst du auf keinen Fall in der dritten Unit für die ausgelagerte Funktion. Windows, SysUtils, Classes sollte reichen.

Christian Seehase 6. Aug 2002 09:17

Moin Luckie,

bei Neu/Unit wird doch gar keine Uses Eintragung in der neuen Unit gemacht :shock: ;-)

MathiasSimmack 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. :roll: :?:

Luckie 6. Aug 2002 10:17

Zitat:

Zitat von Christian Seehase
Moin Luckie,

bei Neu/Unit wird doch gar keine Uses Eintragung in der neuen Unit gemacht :shock: ;-)

Tatsächlich. :shock: :oops:

@Mathias:
Assarbad hat wohl damit:
Code:
// 
// "frmt" (Copyright, Assarbad)
// 
function frmt(mformat: string; args: array of POINTER): string;
var
  buf: array[0..$3ff]of char;
begin
  ZeroMemory(@buf[0], sizeof(buf));
  wvsprintf(@buf[0], @mformat[1], pchar(@args));
  SetString(result, pchar(@buf[0]), lstrlen(@buf[0]));
end;
einen Evergreen geschrieben. Zumindest verfolgt mich das Ding in letzter Zeit ständig. :mrgreen:

MathiasSimmack 6. Aug 2002 12:38

Wie: "ständig"?
Ich hab´s bisher nur einmal im IP-Demo benutzt, um die IP-Adresse schön formatiert an das Label weiterzureichen. Das ist doch nicht ständig. :mrgreen:

Hey, Moment - da hat doch mal jemand, den wir hier nicht näher nennen wollen, vergessen, die "SysUtils.pas" aus seiner NT-Dienst-Erweiterung herauszunehmen ... :wink:

Also, ich denke nur an die Hord... äh, Scharen von NonVCL-Entwicklern, die nach dem Studium unserer -Achtung, Schleichwerbung!- "Delphi-Tutorials" vielleicht auch die Versionsinfos anzeigen lassen wollen. :-)

Luckie 6. Aug 2002 18:41

Diese Vorkommnisse meinte ich. Da kommt mir aber schon wieder eine Idee. Näheres mal in einer Mail an dich.

m-werk 6. Aug 2002 18:52

Hi Leute, ich danke euch. Es hat alles prima funktioniert. Ich habe mich an eure Anweisungen gehalten. Genauso wollte ich es haben. DANKE nochmals.

Luckie 6. Aug 2002 18:56

Gern geschehen. :D


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