Entwickler-Ecke

Sonstiges (Delphi) - Versionsnummer automatisch erhöhen


mwsnet - Sa 19.10.02 18:31
Titel: Versionsnummer automatisch erhöhen
Hallo,

sagt mal, ich würde gerne automatisch nach jedem Compilieren meines Progs die DateiVersion um einen Zähler erhöhen. Also z.B. von 1.0.0.55 auf 1.0.0.56.

Ich arbeite mit Delphi7 Pro und dort gibt es ja eine entsprechende Möglichkeit bei Projekt -> Optionen -> Versionsinfo. Doch wenn ich den entsprechenden Haken setze passiert bei mir gar nichts. Was muss man denn da noch beachten?

Danke.

Grüsse
Michael


Henry - Sa 19.10.02 18:37

Also ich verwende Delphi5 Pro.
Da ist es so, das die Versionsnummer nur erhöht wird wenn
ich das Projekt über

Projekt --> Project1 Compilieren
oder
Projekt --> Project1 erzeugen

Compiliere.

Vieleicht hilft Dir das ja bei D7 auch weiter


mwsnet - Sa 19.10.02 18:58
Titel: Geht
Hi Henry,

jo danke für den Tip. Mit Projekt erzeugen klappt es auch. Das habe ich bisher kaum benutzt, da mein 2 Jahre alter PC dann immer ca. 'ne Minute rumrödelt :roll:

Cu Michael


Henry - Sa 19.10.02 20:45

Das stimmt wohl, das das ne weile dauert.

Aber ich habe noch keine Einstellung gefunden wo es mit F9 auch geht :(

Freut mich aber wenn es geholfen hat


enigma - Mo 21.10.02 10:49

ist es auch möglich die dateiversion auszulesen und dann in der about box anzuzeigen??


Delete - Mo 21.10.02 11:31

Ja.


Marduk - Mo 21.10.02 11:44

Hier haste den Code aus der Delphi Hilfe:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TForm1.Button1Click(Sender: TObject);

const
  InfoNum = 10;
  InfoStr: array[1..InfoNum] of string = ('CompanyName', 'FileDescription', 'FileVersion', 'InternalName', 'LegalCopyright', 'LegalTradeMarks', 'OriginalFileName', 'ProductName', 'ProductVersion', 'Comments');
var
  S: string;
  n, Len, i: DWORD;
  Buf: PChar;
  Value: PChar;
begin
  S := Application.ExeName;
  n := GetFileVersionInfoSize(PChar(S), n);
  if n > 0 then
  begin

    Buf := AllocMem(n);
    Memo1.Lines.Add('VersionInfoSize = ' + IntToStr(n));
    GetFileVersionInfo(PChar(S), 0, n, Buf);
    for i := 1 to InfoNum do
      if VerQueryValue(Buf, PChar('StringFileInfo\040904E4\' + InfoStr[i], Pointer(Value), Len) then
        Memo1.Lines.Add(InfoStr[i] + ' = ' + Value);
    FreeMem(Buf, n);
  end
  else
    Memo1.Lines.Add('No version information found');
end;


Gruß Dennis


Delete - Mo 21.10.02 12:26

Unter welchen Stichwort findet man denn das in der Delphi-Hilfe? :shock:

Und irgendwie haut das ganze auch noch nicht so hin. :?


Marduk - Di 22.10.02 08:56

Okay ich bin ehrlich :oops: , habs selber gar nich getestet.
Gefunden hab ich das ganze mit dem stichwort "versionnumber, setting".
Die Beschreibung hat meiner meinung nach zu dem Problem gepasst:


Quelltext
1:
You can use the Windows GetFileVersionInfo and VerQueryValue API functions to obtain version information that is compiled with your application. The following code illustrates how to do this by writing the version information to a memo control named Memo1:                    


Also war ich überzeugt das richtige zu tun :?

Wenns nich funzt so tuts mir leid :(

Gruß Dennis


LCS - Di 22.10.02 09:05

Hi
Na gut, hier ist meine Variante.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
TTrans = record
   b1 : byte;
    b2 : byte;
    b3 : byte;
    b4 : byte;
  end;

  PTrans = ^TTrans;

procedure GetVersionInfos(var Info: TStringList);
var
  StringBuffer         : PChar;
  VersionPointer       : PChar;
  Size                 : DWord;
  VersionValueLength   : DWord;
  sCountryCode        : string;
begin
   Info.Clear;
    Size := GetFileVersionInfoSize(PChar(Application.Exename), Size);

    if  Size > 0 then begin
      StringBuffer := AllocMem(Size);
      GetFileVersionInfo(PChar(Application.Exename), 0, Size, StringBuffer);

      VerQueryValue(StringBuffer, PChar('\VarFileInfo\Translation'), Pointer(VersionPointer), VersionValueLength);

       sCountryCode  := IntToHex(PTrans(VersionPointer)^.b2, 2) +
                 IntToHex(PTrans(VersionPointer)^.b1, 2) +
                   IntToHex(PTrans(VersionPointer)^.b4, 2) +
                          IntToHex(PTrans(VersionPointer)^.b3, 2);
       Info.Values['CountrCode'] := sCountryCode;

      if   VerQueryValue(StringBuffer, PChar('\StringFileInfo\' + sCountryCode + '\' +
          'CompanyName'), Pointer(VersionPointer), VersionValueLength) then
            Info.Values['CompanyName'] := StrPas(VersionPointer);

      if   VerQueryValue(StringBuffer, PChar('\StringFileInfo\' + sCountryCode + '\' +
          'FileDescription'), Pointer(VersionPointer), VersionValueLength) then
            Info.Values['FileDescription'] := StrPas(VersionPointer);
      if   VerQueryValue(StringBuffer, PChar('\StringFileInfo\' + sCountryCode + '\' +
          'FileVersion'), Pointer(VersionPointer), VersionValueLength) then
            Info.Values['FileVersion'] := StrPas(VersionPointer);
      if   VerQueryValue(StringBuffer, PChar('\StringFileInfo\' + sCountryCode + '\' +
          'InternalName'), Pointer(VersionPointer), VersionValueLength) then
            Info.Values['InternalName'] := StrPas(VersionPointer);
      if   VerQueryValue(StringBuffer, PChar('\StringFileInfo\' + sCountryCode + '\' +
          'LegalCopyright'), Pointer(VersionPointer), VersionValueLength) then
            Info.Values['LegalCopyright'] := StrPas(VersionPointer);
      if   VerQueryValue(StringBuffer, PChar('\StringFileInfo\' + sCountryCode + '\' +
          'LegalTradeMarks'), Pointer(VersionPointer), VersionValueLength) then
            Info.Values['LegalTradeMarks'] := StrPas(VersionPointer);
      if   VerQueryValue(StringBuffer, PChar('\StringFileInfo\' + sCountryCode + '\' +
          'OriginalFilename'), Pointer(VersionPointer), VersionValueLength) then
            Info.Values['OriginalFilename'] := StrPas(VersionPointer);
      if   VerQueryValue(StringBuffer, PChar('\StringFileInfo\' + sCountryCode + '\' +
          'ProductName'), Pointer(VersionPointer), VersionValueLength) then
            Info.Values['ProductName'] := StrPas(VersionPointer);
      if   VerQueryValue(StringBuffer, PChar('\StringFileInfo\' + sCountryCode + '\' +
          'ProductVersion'), Pointer(VersionPointer), VersionValueLength) then
            Info.Values['ProductVersion'] := StrPas(VersionPointer);
      if   VerQueryValue(StringBuffer, PChar('\StringFileInfo\' + sCountryCode + '\' +
          'Comments'), Pointer(VersionPointer), VersionValueLength) then
            Info.Values['Comments'] := StrPas(VersionPointer);

      FreeMem(StringBuffer, Size);
   end;
end;


Sieht ziemlich hässlich aus, funzt aber.

Gruss Lothar


Delete - Di 22.10.02 10:03

Noch eine Variante (auf die Versionsnummer beschränkt!) aus der Delphi-Praxis:
http://www.delphipraxis.net/viewtopic.php?t=604
Meine Variante (s. Seite 2) basiert auf Luckies Variante, und der hat sie von ... keine Ahnung, vielleicht selbstgeschrieben, vielleicht von jemandem übernommen?

Luckie? :?


Delete - Di 22.10.02 11:03

@Mathias: Lies mal das Posting von dem Typen der nach dir gepostet hat in dem DP-Thread.... :wink:


CenBells - Di 22.10.02 11:50

Ich will auch, ich will auch


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
//------------------------------------------------------------------------------
function getApplicationVersion(const AApplicationTitle: String): String;
var
  aFileName: array [0..MAX_PATH] of Char;
  pdwHandle: DWORD;
  nInfoSize: DWORD;
  pFileInfo: Pointer;
  pFixFInfo: PVSFixedFileInfo;
  nFixFInfo: DWORD;
begin
  result := '';
  GetModuleFileName(0, aFileName, MAX_PATH);
  pdwHandle := 0;
  nInfoSize := GetFileVersionInfoSize(aFileName, pdwHandle);
  if nInfoSize <> 0 then
    pFileInfo := GetMemory(nInfoSize)
  else
    pFileInfo := nil;
  if Assigned(pFileInfo) then
  try
    if GetFileVersionInfo(aFileName, pdwHandle, nInfoSize, pFileInfo) then
    begin
      pFixFInfo := nil;
      nFixFInfo := 0;
      if VerQueryValue(pFileInfo, '\', Pointer(pFixFInfo), nFixFInfo) then
      begin
         result := Format(AApplicationTitle + ' ver.  %d.%d.%d.%d',
        [HiWord(pFixFInfo^.dwFileVersionMS),
        LoWord(pFixFInfo^.dwFileVersionMS),
        HiWord(pFixFInfo^.dwFileVersionLS),
        LoWord(pFixFInfo^.dwFileVersionLS)]);
      end;
    end;
  finally
    FreeMemory(pFileInfo);
  end;
end;


Meine Variante. Du übergibst den Titel deiner Anwendung und erhältst einen string wie z.b.
MeineAnwendung ver. 1.0.0.56


Gruß
Ken


Maggi - Di 22.10.02 11:51
Titel: Wie wäre es damit....
Hi,

ich gebe auch mal meine Version zu Besten:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
const
  VerInfoNames : array[0..9] of ShortString =
                            ('CompanyName','FileDescription',
                             'FileVersion','InternalName','LegalCopyright',
                             'LegalTradeMarks','OriginalFilename','ProductName',
                             'ProductVersion','Comments');


procedure TfrmInfo.FormCreate(Sender: TObject);
begin
  lbProgVersion.Caption     := GetEinVersionInfo(Application.ExeName,2);
  lbProgExeName.Caption  := GetEinVersionInfo(Application.ExeName,6);
  lbProgName.Caption       := GetEinVersionInfo(Application.ExeName,3);
  lbProgBezeichnung.Caption := GetEinVersionInfo(Application.ExeName,1);
end;

function GetVersionInfo(FileName, InfoName: String): String;
const
  //EngBrit = '080904E4';
  //EngAm   = '040904E4';
  //EngCand = '100904E4';
  Deutsch = '040704E4';
var
  Len,BufSize : LongWord;
  Buf: PChar;
  Info : PChar;

begin
  Result := '';
  BufSize := GetFileVersionInfoSize(PChar(FileName),BufSize);
  if BufSize > 0 then
  begin
    Buf := AllocMem(BufSize);
    GetFileVersionInfo(PChar(FileName), 0, BufSize, Buf);
    if VerQueryValue(Buf,PChar('\\StringFileInfo\\'+Deutsch+'\\'+InfoName),Pointer(Info),Len) then
    begin
      if Length(Info) > 0 then
        Result := Info;
    end;
    FreeMem(Buf, BufSize);
  end;
end;


function GetEinVersionInfo(FileName: String; Index: Integer): String;
var
  InfoName : String;

begin
  Result := '';
  InfoName := VerInfoNames[Index];
  Result := GetVersionInfo(FileName, InfoName);
end;


Bis denne


Maggi


Delete - Di 22.10.02 11:53

Na, nun hat mwsnet, bzw. enigma ja wirklich die Auswahl.
:)


CenBells - Di 22.10.02 11:58

@ MAggi:

Auch eine sehr schöne Version. :lol:

@Mathias: Naja, dazu ist das Forum doch da. Nun kann er aus dem vollen schöpfen...


Delete - Di 22.10.02 12:01

Nicht ganz. Die Version von Ireniceus ist mit der von Oceanbunny identisch.


Maggi - Di 22.10.02 12:23

@Irenius

Danke :oops: