Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Mit version und Buildnummer arbeiten (https://www.delphipraxis.net/147391-mit-version-und-buildnummer-arbeiten.html)

DelTurbo 7. Feb 2010 13:53


Mit version und Buildnummer arbeiten
 
Hi,

ich habe möchte gerne innerhalb des programms die daten der Versionskontrolle auslesen. Und zwar wollte ich das so ausgeben.

Version 1.1.0 {build 4444} wobei 4444 die compilierungsnummer ist. Die zählt er ja beim erstellen selber hoch. Nun zur frage, kann ich das innerhalb des programms abrufen ob muss man wirklich den umweg über die .exe nehmen?? Alles was ich gefunden habe (bestimmt wieder falsch gesucht) geht diesen umweg.

Danke im voraus

daywalker9 7. Feb 2010 14:00

Re: Mit version und Buildnummer arbeiten
 
Meinst du sowas?

Damit kannst du dir die Versionsinformationen aus der Datei holen, die du mit fileName übergibst.

Delphi-Quellcode:
type tFileVersionRec = record Fixed : TVSFixedFileInfo;
                              hauptversion,
                              nebenversion,
                              Ausgabe    ,
                              Compilierung:word;
                              BetaVersion : boolean;
                       end;

function GetVersionInfo (filename : shortstring;var fw : tFileVersionRec ) : boolean;
var dw,size,len : longword;
    p : par64;
    s : string[10];
    p2 : pointer;
    ok : boolean;
begin result:=false;
      filename:=filename+#0;
      dw:=1;
      size:=GetFileVersionInfoSize(@filename[1],dw);
      if (size=0) or (dw<>0) then exit;
      getmem(p,size);
      ok:=GetFileVersionInfo(@filename[1],dw,size,p);
      if ok then
        begin s:='\'+#0;
              ok:=VerQueryValue(p,@s[1],p2,len);
              move(p2^,fw.fixed,maximum(len,sizeof(fw.fixed)));
              fw.hauptversion:=hiword(fw.fixed.dwFileVersionMS);
              fw.nebenversion:=loword(fw.fixed.dwFileVersionMS);
              fw.Ausgabe    :=hiword(fw.fixed.dwFileVersionLS);
              fw.Compilierung:=loword(fw.fixed.dwFileVersionLS);
              fw.betaversion :=(fw.fixed.dwfileflags and $2)>0;
        end;
      freemem(p);
      result:=ok;
end;

himitsu 7. Feb 2010 14:02

Re: Mit version und Buildnummer arbeiten
 
http://www.delphipraxis.net/internal...093232#1093232
und
http://www.delphipraxis.net/internal...t.php?p=659907

DelTurbo 7. Feb 2010 14:06

Re: Mit version und Buildnummer arbeiten
 
Ja sowas in der art. Aber halt OHNE diesen "umweg" über das exe-file. Ich will ja kein anderes prg abfragen sondern nur den kram von meinem prg wissen. Ich dachte das kann man "intern" ermitteln.

daywalker9 7. Feb 2010 14:08

Re: Mit version und Buildnummer arbeiten
 
Wenn du das von deinem programm abfragen willst, nehm doch
Delphi-Quellcode:
var fw : tFileVersionRec;
begin
  GetFileVersion(Application.Exename,fw);
end;

Luckie 7. Feb 2010 14:15

Re: Mit version und Buildnummer arbeiten
 
Zitat:

Zitat von DelTurbo
Ja sowas in der art. Aber halt OHNE diesen "umweg" über das exe-file. Ich will ja kein anderes prg abfragen sondern nur den kram von meinem prg wissen. Ich dachte das kann man "intern" ermitteln.

Wenn nicht aus der Programmdatei, wo willst du die Informationen denn dann herbekommen?

DelTurbo 7. Feb 2010 14:18

Re: Mit version und Buildnummer arbeiten
 
Ich dachte es gibt einen Record oder was weiss ich, der gesetzt ist. Aber den antworten und meinen google ergebnissen entnehme ich das es sowas wohl nicht gibt. Schade.

Da dem wohl nicht so ist, also es keinen interne variable/record oder so gibt, nehme ich dankend die routine von daywalker9. :thumb:

Luckie 7. Feb 2010 14:20

Re: Mit version und Buildnummer arbeiten
 
Klar gibt es den Record, denn irgendwo müssen die Daten ja gespeichert sein. Dieser Record steht in den Ressourcen der Exe und diese sind natürlich einkompiliert:
Code:
IDR_VERSION VERSIONINFO
FILEVERSION 1, 0, 0, 15
PRODUCTVERSION 1,0,0,0
FILEOS 0x00000004
FILETYPE 0x00000001
BEGIN
  BLOCK "StringFileInfo"
  BEGIN
    BLOCK "04090000"
    BEGIN
      VALUE "FileVersion", "1, 0, 0, 15\0"
      VALUE "FileDescription", "nonVCL Dialog Template\0"
      VALUE "LegalCopyright", "Michael Puff\0"
      VALUE "ProductName", "Dialog Template\0"
    END
  END
  BLOCK "VarFileInfo"
  BEGIN
    VALUE "Translation", 0x0409, 0x0000
  END
END
Oder wo sollte dieser Record deiner Meinung nach stehen?

DelTurbo 7. Feb 2010 14:30

Re: Mit version und Buildnummer arbeiten
 
Ich glaube wir reden aneinander vorbei. Mir ist auch klar das der kram in der exe stehen muss. Nu weiss ich garnicht wie ich mich ausdrücken soll....

BEISPIEL!!!!!!!!

Versionsnummer:=RecordWasWeissIch.Version;
SubVersion:=RecordWasWeissIch.SubVersion;


Ich dachte sowas gibt es.

mkinzler 7. Feb 2010 14:32

Re: Mit version und Buildnummer arbeiten
 
Erst nach dem Linken, deshalb muss dies auch aus der Exe gelesen werden!

sx2008 7. Feb 2010 14:33

Re: Mit version und Buildnummer arbeiten
 
Zitat:

Zitat von DelTurbo
Nun zur frage, kann ich das innerhalb des programms abrufen ob muss man wirklich den umweg über die .exe nehmen??

Du hast die Vorstellung, die Version wäre schon im Speicher irgendwo geladen.
Dem ist nicht so, denn die Versioninformation ist eine Resource.
Resourcen werden nur geladen, wenn das Programm sie explizit anfordert.
Man könnte nun die Resource mit der API-Funktion LoadResource() laden und als ModuleHandle eine 0 übergeben.
Aber ich denke, das lohnt den Aufwand nicht.

Luckie 7. Feb 2010 14:33

Re: Mit version und Buildnummer arbeiten
 
Genau das hat dir daywalker doch gegeben:
Delphi-Quellcode:
type tFileVersionRec = record Fixed : TVSFixedFileInfo;
                              hauptversion,
                              nebenversion,
                              Ausgabe    ,
                              Compilierung:word;
                              BetaVersion : boolean;
                       end;

DelTurbo 7. Feb 2010 14:36

Re: Mit version und Buildnummer arbeiten
 
Eigentlich hätte mir als antwort
"nein, geht nicht. du musst den umweg nehmen"
voll und ganz gereicht.

Trotzdem vielen dank euch allen

himitsu 7. Feb 2010 14:37

Re: Mit version und Buildnummer arbeiten
 
Zitat:

Zitat von DelTurbo
Ich glaube wir reden aneinander vorbei. Mir ist auch klar das der kram in der exe stehen muss. Nu weiss ich garnicht wie ich mich ausdrücken soll....

Klar gibt es sowas ... dir sollte eigentlich TVSFixedFileInfo in den ganzen Beispielcodes aufgefallen sein.

DelTurbo 7. Feb 2010 14:37

Re: Mit version und Buildnummer arbeiten
 
Zitat:

Zitat von DelTurbo
Ich Da dem wohl nicht so ist, also es keinen interne variable/record oder so gibt, nehme ich dankend die routine von daywalker9. :thumb:


Luckie 7. Feb 2010 14:40

Re: Mit version und Buildnummer arbeiten
 
Jetzt verstehe ich dich. Du dachstest man müsste das nicht selber auslesen, sondern die VCL oder Windows-API würde dir das schon als Konstante oder Variable zur Verfügung stellen. Nein, dem ist nicht so. Du musst die Werte schon selber aus der Ressource auslesen, wie es daywalker vorgemacht hat.

DelTurbo 7. Feb 2010 14:45

Re: Mit version und Buildnummer arbeiten
 
Uff, danke Luckie. Ich dachte schon ich rede eine andere sprache.

Mal was wirklich witziges. Ich bekomme das nicht übersetzt wegen dem par64. Naja dachte ich, willst ja nicht schon wieder fragen.... also "delphi par64" in google rein. Der erste treffer war dieser Thread hier. *muuuuhahaha*

Also... muss ich trotzdem fragen wer oder was par64 ist....

daywalker9 7. Feb 2010 14:48

Re: Mit version und Buildnummer arbeiten
 
Achso, hatte ich vergessen:
Delphi-Quellcode:
type pAr64    = ^tAr64;
     tAr64    = array [0..MaxLongInt-1] of byte;

DelTurbo 7. Feb 2010 14:56

Re: Mit version und Buildnummer arbeiten
 
Nun scheiter ich schon an nem dreizeiler. Ich glaube heut ist nicht mein tag ;)

Was ist denn maximum??? bzw. in welcher unit ist das drinne? Ich kenne nur max.

daywalker9 7. Feb 2010 15:00

Re: Mit version und Buildnummer arbeiten
 
Benutzte max. Ich habe viele eigene funktionen, typen die ich so benutzte. wie z.b maximum und pAr64

DelTurbo 7. Feb 2010 15:11

Re: Mit version und Buildnummer arbeiten
 
Achso, ok. Danke dir....

MartinK 22. Nov 2013 11:51

AW: Mit version und Buildnummer arbeiten
 
Ich habe hier noch eine leichter integrierbare Version gefunden.
Vielleicht kann das ja jemand gebrauchen.

Delphi-Quellcode:
if VerInfoSize > 0 then
  begin
      GetMem(VerInfo, VerInfoSize);
      try
        if GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo) then
        begin
          VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
          with VerValue^ do
          begin
            V1 := dwFileVersionMS shr 16;
            V2 := dwFileVersionMS and $FFFF;
            V3 := dwFileVersionLS shr 16;
            V4 := dwFileVersionLS and $FFFF;
          end;
        end;
      finally
        FreeMem(VerInfo, VerInfoSize);
      end;
  end;
end;

function GetBuildInfoAsString: string;
var
  V1, V2, V3, V4: word;
begin
  GetBuildInfo(V1, V2, V3, V4);
  Result := IntToStr(V1) + '.' + IntToStr(V2) + '.' +
    IntToStr(V3) + '.' + IntToStr(V4);
end;
und hier der Aufruf davon
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.Caption := Form1.Caption + ' - v' + GetBuildInfoAsString;
end;

himitsu 22. Nov 2013 11:57

AW: Mit version und Buildnummer arbeiten
 
Ich hatte mir das auch mal in einer Art Klasse verpackt.
http://www.delphipraxis.net/151804-f...resourcen.html
Da werden auch noch solche Dinge, wie z.B. das Debug-Flag ausgewetet, denn man kann auch eine Version direkt als Testversion markieren.

Müsste mal schauen wie aktuell diese Version der Version ist, aber ich glaub daran ha sich nichts verändert ... Aktuellstes siehe Helper-Unit im Hier im Forum suchenManifest-Creator


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