AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Version der BPL ermitteln

Ein Thema von oki · begonnen am 23. Apr 2009 · letzter Beitrag vom 28. Apr 2009
Antwort Antwort
Seite 1 von 2  1 2      
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#1

Version der BPL ermitteln

  Alt 23. Apr 2009, 14:19
Hallo Leute,

ich möchte in meinem Programm eine Funktion implementieren, die mir die Versionsnummer meiner eigenen verwendeten BPL ausgiebt. Das natürlich nicht, indem ich die Versionsnummer in den Code schreibe!

Der Grund ist folgender. Ich habe eine eigene BPL geschrieben, die durch mehrere meiner Programme als Designzeit BPL genutzt wird. Da die BPL fortlaufend erweitert wird und zwischendurch immer neue Programme entsehen, die diese BPL einbinden möchte ich später das entsprechende Programm fragen können, mit welcher meiner BPL-Version es compiliert wurde. Es geht also nicht um die Versionsnummer des eigentlichen Programmes, sondern um die Version der gelinkten BPL.

Der Sinn der Sache ist, dass ich an Hand meiner Versionskontrolle prüfen kann, welcher Funktionsumfang im Programm enthalten ist, der durch die entsprechende Version der BPL zum Zeitpunkt des Compilings vorliegt.

Schön, wenn mir da einer auf die Sprünge helfen kann,

Dank im Voraus und Gruß

oki
42
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Version der BPL ermitteln

  Alt 23. Apr 2009, 15:10
Ein BPL ist ja im Grunde eine DLL.
Ein DLL kann eine VersionInfo Resource enthalten, die man auslesen kann.
Auch der Windows Explorer kann diese Informationen auslesen und anzeigen (rechtsklick->Eigenschaften).
ich schreibe das nur, damit wir alle vom Gleichen reden.
Über die Optionen des Package kann man die VersionInfo editieren und Delphi schreibt die Resource in die BPL.

Also heist die Frage: wie kann man die Versionsinfo einer beliebigen DLL, EXE oder anderen Datei im PE-Format auslesen?
Versionsinfo auslesen
In der JCL gibt es übrigens die Klasse TJclFileVersionInfo, die keine Wünsche mehr offen lässt.
Andreas
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#3

Re: Version der BPL ermitteln

  Alt 23. Apr 2009, 15:58
Zitat von shmia:
Also heist die Frage: wie kann man die Versionsinfo einer beliebigen DLL, EXE oder anderen Datei im PE-Format auslesen?
Versionsinfo auslesen
In der JCL gibt es übrigens die Klasse TJclFileVersionInfo, die keine Wünsche mehr offen lässt.
Was aber, wenn die BPL statisch verlinkt wird?
Dann bekommt man doch immer nur die aktuelle Version, oder etwa nicht?
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Version der BPL ermitteln

  Alt 23. Apr 2009, 16:21
Hi shmia,
ja, dass kenne ich und ist auch nicht das Problem. Ich mache es aber so, wie es DevilsCamp vermutet. Ich linke die BPL statisch in die Exe. Und genau da steckt mein Problem.
Alle Einwände ich sollte die BPL dynamisch laden kann ich hier gleich abwürgen. Es sollen keine BPL mit auf den Zielrechner. Nur die Exe.

Gruß oki
42
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

Re: Version der BPL ermitteln

  Alt 23. Apr 2009, 16:23
Zitat von DevilsCamp:
Was aber, wenn die BPL statisch verlinkt wird?
Dann bekommt man doch immer nur die aktuelle Version, oder etwa nicht?
Wenn die Units statisch in die Applikation gelinkt wurden, dann werden ja keine BPL benützt oder gebraucht.
Damit entfällt auch die Notwendigkeit die Version abzufragen.

Falls du mit statisch verlinkt meinst, dass die BPLs gleich beim Programmstart geladen werden, dann könnte man auch so vorgehen.
Mit GetModuleHandle('name_der_Bibliothek.bpl') das Handle holen, dann LoadResource() und FindResource() und LockResource() die VersionInfo Daten auslesen.
Irgendwo verwaltet die VCL (oder Windows ?) auch alle Handles der geladenen BPLs; so könnte man die VersionInfos auslesen ohne die Namen der beteiligten BPLs kennen zu müssen.
Andreas
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Version der BPL ermitteln

  Alt 23. Apr 2009, 16:46
Hallo shmia,
sorry für die ungenaue Beschreibung. Die Exe lädt die BPL nicht, sondern ist als DesigntimePackage im Projekt der Exe enthalten. Die Exe ist ohne die Benutzung von RuntimePackages compiliert.
Richtig, , für diesen Fall wird die BPL ja gar nicht in die Exe mit aufgenommen, sondern die Units mit gelinkt. Blöd, wie bekomme ich da eine automatische Versionskontrolle hin außer das in einer eigenen Funktion immer händisch nachpflegen zu müssen.

Ich hatte schon überlegt das im Pre- oder AfterBuild unterzubringen. Aber da bekomme ich es ja auch nicht in die Exe sondern nur in eine externe Datei. Oder kennt jemand eine Möglichkeit wie ich das im PreBuild in die Ressource gepackt bekomme? Das ist doch eine Idee

Gruß oki
42
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#7

Re: Version der BPL ermitteln

  Alt 23. Apr 2009, 16:58
Zitat von shmia:
Zitat von DevilsCamp:
Was aber, wenn die BPL statisch verlinkt wird?
Dann bekommt man doch immer nur die aktuelle Version, oder etwa nicht?
Wenn die Units statisch in die Applikation gelinkt wurden, dann werden ja keine BPL benützt oder gebraucht.
Damit entfällt auch die Notwendigkeit die Version abzufragen.
Finde ich nicht. Genau DANN ist es doch sinnvoll herauszufinden, auf welchen Stand die Komponenten, Klassen, usw. sind.

Ideal wäre aber, wenn es eine Mischung aus Version der DLL und Konstante gäbe. Also ein Macro, das bei jedem Build die aktuelle Version als Variable/Konstante zur Verfügung stellt, deren Wert man im Programm abfragen kann.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

Re: Version der BPL ermitteln

  Alt 23. Apr 2009, 17:31
Die JCL unterstützt auch das sogenannte Unit-Versioning.
Dazu kann man in jede Unit, die man überwachen will einen const Record einfügen:
Delphi-Quellcode:
{$IFDEF UNITVERSIONING}
const
  UnitVersioning: TUnitVersionInfo = (
    RCSfile: '$URL: [url]https://jcl.svn.sourceforge.net:443/svnroot/jcl/tags/JCL-1.101-Build2725/jcl/source/common/JclFileUtils.pas[/url] $';
    Revision: '$Revision: 2101 $';
    Date: '$Date: 2007-08-04 22:00:43 +0200 (sam., 04 août 2007) $';
    LogPath: 'JCL\source\common'
    );
{$ENDIF UNITVERSIONING}
....
{$IFDEF UNITVERSIONING}
initialization
  RegisterUnitVersion(HInstance, UnitVersioning);

finalization
  UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}

end.
Es gibt dann Funktionen (Unit JclUnitVersioning), um diese Informationen auszulesen.
Dieses System funktioniert auch dann, wenn BPLs benützt werden.
Andreas
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Version der BPL ermitteln

  Alt 23. Apr 2009, 17:33
Zitat:
Finde ich nicht. Genau DANN ist es doch sinnvoll herauszufinden, auf welchen Stand die Komponenten, Klassen, usw. sind.
Genau so steht es im Moment mit meinem Bedarf. Ich muss wissen, welchen Stand die BPL zum Zeitpunkt der Erstellung der jeweiligen Exe hatte.
Die Frage ist aber weiterhin, wie ich die Version der BPL in die Exe bekommen.

Gruß oki
42
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Version der BPL ermitteln

  Alt 23. Apr 2009, 17:37
Zitat von shmia:
Die JCL unterstützt auch das sogenannte Unit-Versioning.
Dazu kann man in jede Unit, die man überwachen will einen const Record einfügen:
Delphi-Quellcode:
{$IFDEF UNITVERSIONING}
const
  UnitVersioning: TUnitVersionInfo = (
    RCSfile: '$URL: [url]https://jcl.svn.sourceforge.net:443/svnroot/jcl/tags/JCL-1.101-Build2725/jcl/source/common/JclFileUtils.pas[/url] $';
    Revision: '$Revision: 2101 $';
    Date: '$Date: 2007-08-04 22:00:43 +0200 (sam., 04 août 2007) $';
    LogPath: 'JCL\source\common'
    );
{$ENDIF UNITVERSIONING}
....
{$IFDEF UNITVERSIONING}
initialization
  RegisterUnitVersion(HInstance, UnitVersioning);

finalization
  UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}

end.
Es gibt dann Funktionen (Unit JclUnitVersioning), um diese Informationen auszulesen.
Dieses System funktioniert auch dann, wenn BPLs benützt werden.
Jo, sieht erst mal sehr gut aus. Ich geb aber ehrlich zu, dass ich noch keinen blassen Schimmer habe, wie ich über die Exe mittels Funktion an die Version komme.
Die nächste Frage ist, wie gleiche ich die Version in UnitVersioning auf die Version der BPL ab.

Fragen über Fragen, auf deutsch ich seh nicht durch.

Gruß oki
42
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:26 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