Autor Beitrag
Grendel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 443

Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
BeitragVerfasst: Di 23.11.04 15:20 
Moin, moin!

Kann mir bitte jemand verraten, in welchen Dateien Delphi die Versionsnummern eines Delphi 7 Projektes hinterlegt.
Mein Problem ist, daß ich die Compileroptionen/Projektversionen über ein kleines Tool setzen muss, ich aber scheinbar zu dämlich bin alle Stellen zu finden, an denen die Versionsnummer steht. (Compileroptionen funktioniert bereits einwandfrei).

Gefunden habe ich bisher folgendes:

In den .dof Dateien steht zum einen:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
[Version Info]
IncludeVerInfo=1
AutoIncBuild=1
MajorVer=20
MinorVer=1
Release=5
Build=1
Debug=0


und noch:
ausblenden Quelltext
1:
2:
3:
4:
[Version Info Keys]
CompanyName=
FileDescription=
FileVersion=20.0.0.1


Weiterhin hab ich in den .res Dateien noch dies gefunden:
ausblenden Quelltext
1:
F i l e V e r s i o n     2 0 . 1 7 . 2 5 . 1 3 6 3					


Liegt keine .res Datei zu der entsprechenden .dpk vor werden offensichtlich die Versionsnummern aus der .dof Datei gelesen. Existiert hingegen eine .res Datei wird die .dof schlicht ignoriert.
Die Versionsinfo scheint aber dennoch nicht aus der .res Datei gelesen zu werden, denn selbst nachdem ich die versionsnummer per HexEditor geändert habe war (nach neuladen des projektes/Delhpi neustart) nichts von meiner Änderung zu sehen.

An welcher Stelle könnte die Versionsnummer noch hinterlegt sein?
Bin für jeden (noch so kleinen) Denkanstoss dankbar.

Bis neulich ...


Moderiert von user profile iconTino: Topic aus Sonstiges verschoben am Fr 03.12.2004 um 09:45
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Di 23.11.04 17:21 
das ist genau das was du brauchst:
[Version Info]
IncludeVerInfo=1
AutoIncBuild=1
MajorVer=20
MinorVer=1
Release=5
Build=1
Debug=0

diese paramerter geben die version deinen proggis an !
das wird dann quasi so kompiliert: MajorVer.MinorVer.Release.Build
also bei dir 20.1.5.1

_________________
In the beginning was the word.
And the word was content-type: text/plain.
Grendel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 443

Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
BeitragVerfasst: Di 23.11.04 17:28 
Erstmal Danke für Deine Antwort!

matze hat folgendes geschrieben:
das ist genau das was du brauchst:
[Version Info]
IncludeVerInfo=1
AutoIncBuild=1
MajorVer=20
MinorVer=1
Release=5
Build=1
Debug=0

Ja schon, aber nur wenn keine .res Datei existiert. Gibt es eine .res kann ich in der .dof eintragen was immer ich will; Delphi interessiert das nicht die Bohne :(

Selbst wenn ich in der .dof und in der .res eine identische Nummer eintrage ändert das nichts. Die Optionen für dieses Paket zeigen noch immer die zuletzt (mit Delphi) eingestellte Nummer an.
Und ich hab keinen Schimmer wo diese Information noch herkommen soll.

Bis neulich ...
Grendel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 443

Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
BeitragVerfasst: Do 25.11.04 17:34 
Keiner eine Idee?!

Wäre denn evtl. jemand von euch so nett, daß ganze mal bei sich zu testen.
Also einfach ein .dpk erstellen, Versionsnummer angeben und speichern.
Dann in der .dof mit einem Texteditor die Versionsnummer ändern und in der .res das selbe Spiel mit einem HEX-Editor.
Dann besagtes .dpk öffnen und prüfen, ob die geänderte Version auftaucht.

Ich hab mittlerweile auch schon die komplette Registry durchsucht, in der Hoffnung dort etwas zu finden (auch wenn es dort nichts verloren hätte) aber auch hier war nix :(

Bis neulich ...
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Do 25.11.04 19:22 
nimmt der auch beim neu erstellen (nicht neu kompilieren) die werte aus der res und nicht auch der dof ?

_________________
In the beginning was the word.
And the word was content-type: text/plain.
Grendel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 443

Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
BeitragVerfasst: Fr 26.11.04 14:57 
Da meine Antwort scheinbar den Serverumzug zum Opfer gefallen also nochmal:

matze hat folgendes geschrieben:
nimmt der auch beim neu erstellen (nicht neu kompilieren) die werte aus der res und nicht auch der dof ?

Die Versionsnummer des Kompilates habe ich mir garnicht angeguckt. Mein Vorgehen war folgendes:

1. dpk erstellen
2. Versionsnummer einstellen (Projektoptionen)
3. Speichern und Delphi beenden
4. editieren der Versionsnummer in der .dof und .res
5. (.res Datei löschen)
6. Delphi öffnen und dpk laden
7. Projektoptionen öffnen und Versionsnummer prüfen

Wird Punkt 5 "Res Datei löschen" durchgeführt erscheint bei Punkt 7. die in 4. vergebene Nummer. Wird 5. nicht durchgeführt zeigt 7. die Nummer, die bei Punkt 2. vergeben wurde.

Bis neulich ...
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Sa 27.11.04 11:26 
na dann machst doch so. und schau mal nach was passiert, wenn du 5. nicht machst und dann das Projekt komplierst !

_________________
In the beginning was the word.
And the word was content-type: text/plain.
Grendel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 443

Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
BeitragVerfasst: Sa 27.11.04 13:41 
Ich habs gefunden. Manchmal ist man einfach zu blind.

In der .res steht die Nummer zweimal drin (musste ja auch). Und zwar zusätzlich zu o.g. nochmal hexadezimal.
Wobei die Reihenfolge "Minor", "Major", "Build" "Release" ist.

7.6.5.2:
EFFE 0000 0100 0600 0700 0200 0500

12.11.10.2:
EFFE 0000 0100 0B00 0C00 0200 0A00

Bis neulich ...
Grendel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 443

Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
BeitragVerfasst: Sa 27.11.04 19:49 
Hab eben mal eine Klasse zum setzen der Versionsnummer hingeschmiert.
Falls jemand so etwas brauchen kann, bitte sehr:

Zusätzlich wird noch die Klasse TRegExpr benötigt
regexpstudio.com/TRegExpr/TRegExpr.html

Benutzung:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
  res := TResFile.Create();
  res.LoadFile('C:\dings.res');
  
  // Version auslesen
  writeln('hexadezimal');
  writeln(res.HexMajor + '.' + res.HexMinor + '.' + res.HexRelease + '.' + res.HexBuild);
  writeln('dezimal');
  writeln(res.DecMajor + '.' + res.DecMinor + '.' + res.DecRelease + '.' + res.DecBuild);

  // Version setzten (nur dezimal)
  res.DecMajor := 123;
  res.DecMinor := 456;
  // ...

  res.SaveFile();
  res.Free();


ausblenden volle Höhe Delphi-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:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
unit ResFileU;

interface

uses
  SysUtils, Classes;

type
  TResFile = class(TObject)
  private
    { Private-Deklarationen }
    FHexMajor: String;
    FHexText: String;
    FHexRelease: String;
    FHexBuild: String;
    FHexMinor: String;
    FDecMajor: Integer;
    FDecMinor: Integer;
    FDecBuild: Integer;
    FDecRelease: Integer;
    FFileName: TFileName;
    procedure ParseFile();
    procedure RefreshHexText();
    function SwapHex(AHexStr: String): String;
    procedure SetDecMajor(const Value: Integer);
    procedure SetDecMinor(const Value: Integer);
    procedure SetDecBuild(const Value: Integer);
    procedure SetDecRelease(const Value: Integer);
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    constructor Create(); reintroduce;
    destructor  Destroy(); override;
    
    function LoadFile(AFileName: String): Boolean;
    function SaveFile(): Boolean;

    property DecMajor  : Integer read FDecMajor   write SetDecMajor;
    property DecMinor  : Integer read FDecMinor   write SetDecMinor;
    property DecRelease: Integer read FDecRelease write SetDecRelease;
    property DecBuild  : Integer read FDecBuild   write SetDecBuild;

    property HexMajor  : String read FHexMajor;
    property HexMinor  : String read FHexMinor;
    property HexRelease: String read FHexRelease;
    property HexBuild  : String read FHexBuild;
    property HexText   : String read FHexText;

    property FileName  : TFileName read FFileName;
  end;

implementation

uses

 RegExpr;

{ TResFile }

constructor TResFile.Create();
begin
  inherited Create();
  FHexMajor   := '';
  FHexMinor   := '';
  FHexRelease := '';
  FHexBuild   := '';

  FDecMajor   := 0;
  FDecMinor   := 0;
  FDecRelease := 0;
  FDecBuild   := 0;
end;

destructor TResFile.Destroy;
begin

  inherited;
end;

function TResFile.LoadFile(AFileName: String): Boolean;
var
  FS: TFileStream;
  BinBuffer: String;
  HexBuffer: String;
begin
  try
    FFileName := AFileName;

    Result := True;
    FS := TFileStream.Create(FFileName, fmOpenReadWrite);
    FS.Seek(0,0);
    SetLength(BinBuffer, FS.Size);
    FS.Read(PChar(BinBuffer)^, FS.Size);
    FS.Free();

    SetLength(HexBuffer, Length(BinBuffer) * 2);
    BinToHex(PChar(BinBuffer), PChar(HexBuffer), Length(BinBuffer));
    FHexText := HexBuffer;

    ParseFile();    
  except
    Result := False;
  end;
end;

procedure TResFile.ParseFile();
var
  reg: TRegExpr;
begin
  reg := TRegExpr.Create();

  reg.Expression := 'EFFE\w\w\w\w\w\w\w\w(\w\w\w\w)(\w\w\w\w)(\w\w\w\w)(\w\w\w\w)';
  if reg.Exec(FHexText) then
  begin
    FHexMajor   := SwapHex(reg.Match[2]);
    FHexMinor   := SwapHex(reg.Match[1]);
    FHexRelease := SwapHex(reg.Match[4]);
    FHexBuild   := SwapHex(reg.Match[3]);

    FDecMajor   := StrToInt('$' + FHexMajor);
    FDecMinor   := StrToInt('$' + FHexMinor);
    FDecRelease := StrToInt('$' + FHexRelease);
    FDecBuild   := StrToInt('$' + FHexBuild);
  end;
  reg.Free();
end;

procedure TResFile.RefreshHexText;
var
  reg: TRegExpr;
  tmp: String;
begin
  reg := TRegExpr.Create();
  reg.Expression := 'EFFE\w\w\w\w\w\w\w\w(\w\w\w\w)\w\w\w\w\w\w\w\w(\w\w\w\w)';
  if reg.Exec(FHexText) then
  begin
    tmp := copy(FHexText, 0, reg.MatchPos[1] - 1);
    tmp := tmp + SwapHex(FHexMinor) + SwapHex(FHexMajor)
               + SwapHex(FHexBuild) + SwapHex(FHexRelease);
    tmp := tmp + copy(FHexText, reg.MatchPos[2] + 4, Length(FHexText));
    FHexText := tmp;
  end;
  reg.Free();
end;

function TResFile.SaveFile(): Boolean;
var
 FS: TFileStream;
 BinBuffer: String;
begin
  try
    Result := True;
    RefreshHexText();

    SetLength(BinBuffer, Length(FHexText) div 2);
    HexToBin(PChar(FHexText), PChar(BinBuffer), Length(BinBuffer));
    FS := TFileStream.Create(FFileName, fmCreate);
    FS.Seek(0,0);
    FS.Write(PChar(BinBuffer)^, Length(BinBuffer));
    FS.Free();
  except
    Result := False;
  end;
end;

procedure TResFile.SetDecBuild(const Value: Integer);
begin
  FDecBuild := Value;
  FHexBuild := IntToHex(FDecBuild, 4);
end;

procedure TResFile.SetDecMajor(const Value: Integer);
begin
  FDecMajor := Value;
  FHexMajor := IntToHex(FDecMajor, 4);
end;

procedure TResFile.SetDecMinor(const Value: Integer);
begin
  FDecMinor := Value;
  FHexMinor := IntToHex(FDecMinor, 4);
end;

procedure TResFile.SetDecRelease(const Value: Integer);
begin
  FDecRelease := Value;
  FHexRelease := IntToHex(FDecRelease, 4);  
end;

function TResFile.SwapHex(AHexStr: String): String;
begin
  Result := copy(AHexStr, 32) + copy(AHexStr, 02);
end;

end.


Bis neulich ...