Autor |
Beitrag |
Grendel
      
Beiträge: 443
Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
|
Verfasst: 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:
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:
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:
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 Tino: Topic aus Sonstiges verschoben am Fr 03.12.2004 um 09:45
|
|
matze
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: 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 
      
Beiträge: 443
Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
|
Verfasst: 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 
      
Beiträge: 443
Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
|
Verfasst: 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
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: 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 
      
Beiträge: 443
Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
|
Verfasst: 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
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: 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 
      
Beiträge: 443
Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
|
Verfasst: 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 
      
Beiträge: 443
Gentoo Linux, MacOS X, Win 2000
D5 Ent, D7 Ent, Lazarus, Anjuta, MonoDevelop
|
Verfasst: 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:
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'); writeln('hexadezimal'); writeln(res.HexMajor + '.' + res.HexMinor + '.' + res.HexRelease + '.' + res.HexBuild); writeln('dezimal'); writeln(res.DecMajor + '.' + res.DecMinor + '.' + res.DecRelease + '.' + res.DecBuild);
res.DecMajor := 123; res.DecMinor := 456; res.SaveFile(); res.Free(); |
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 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 public 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;
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, 3, 2) + copy(AHexStr, 0, 2); end;
end. |
Bis neulich ...
|
|
|