Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Verständnisfrage zu Laufzeitbibliotheken (https://www.delphipraxis.net/148685-verstaendnisfrage-zu-laufzeitbibliotheken.html)

hanspeter 6. Mär 2010 08:32


Verständnisfrage zu Laufzeitbibliotheken
 
Hallo,

mir ist ein Zusammenhang nicht ganz klar, vielleicht kann wer mir auf die Sprünge helfen.
Ich lege eine BPL an. Es entsteht DCU, BPL und DCP.
Verwende ich die BPL direkt in einem Programm interessiert sich der Compiler für dcp und bpl gar nicht.
Er benötigt die DCU und linkt diese direkt in das Projekt.

Gebe ich die BPL jetzt als Laufzeitbibliothek an (und nur diese), dann wird BPL/DCP auch ohne DCU gefunden
und verwendet.
Beim Programmstart wird diese Bibliothek automatisch mit geladen?
Zumindest kann ich in meinem Testprogramm auf Funktionen dieser bpl aus dem Programmcontext heraus zugreifen, ohne das Laden explizit zu veranlassen.
Wenn ich jetzt keine weiteren Laufzeitbibliotheken angebe, welche VCL,rtl u.s.w. verwendet jetzt diese Bibliothek?
Werden die benötigten BPL implizit als Laufzeitbibliotheken geladen oder wird die bereits in das Projekt eingebundene Bibliothek verwendet?


Gruß
Peter

chaosben 6. Mär 2010 11:03

Re: Verständnisfrage zu Laufzeitbibliotheken
 
Erstmal ein Wort zu den Endungen - da erklärt sich schon manches:

DCU -> Delphi Compiled Unit (eine kompilierte Unit die mal in das Binary gelinkt werden soll)
BPL -> Borland Package Library (von der Sache her eine "normale" DLL deren Exports nach der Delphi-Nomenklatur aufgebaut sind)
DCP -> Delphi Compiled Package (gehört zu einer BPL und beinhaltet die Information, damit die IDE/(der Compiler?) mit dem Package arbeiten kann)

Die DCU kannst du komplett ignorieren.
Die BPL brauchst du zu Entwicklungszeit und wenn du das Programm auslieferst, weil darin der eigentliche Code steckt.
Die DCP brauchst du nur zu Entwicklungszeit, damit die IDE weiß, welche Units, Funktionen, Klassen, ... in der BPL stecken. Die DCP weiß auch wie die BPL heißt.
Deshalb wir in der requires-clause im Projekt auch die DCP angegeben und nicht die BPL.

Welche weiteren Packages nötig sind, stellt der Compiler(?)/die IDE fest. Entweder sagt der Compiler, das er die Unit XYZ implizit einkompiliert hat, was sehr sehr unschön ist, weil es dann irgendwann eine Kollision mit einem Package gibt, das diese Datei auch beinhaltet. Oder die IDE sagt: Ha! Du musst noch folgenden Packages requiren damit es klappt. Das ist der beste Fall

hanspeter 6. Mär 2010 12:04

Re: Verständnisfrage zu Laufzeitbibliotheken
 
Zitat:

Zitat von chaosben
Welche weiteren Packages nötig sind, stellt der Compiler(?)/die IDE fest. Entweder sagt der Compiler, das er die Unit XYZ implizit einkompiliert hat, was sehr sehr unschön ist, weil es dann irgendwann eine Kollision mit einem Package gibt, das diese Datei auch beinhaltet. Oder die IDE sagt: Ha! Du musst noch folgenden Packages requiren damit es klappt. Das ist der beste Fall

Was die Fileendungen bedeuten weis ich schon. Aber genau so wie beschrieben, verhält sich der Compiler leider nicht.
Die requires Anweisung gibt es nur in Packages.

Ich bin gerade dabei mit einem Testprojekt zu basteln, um die Frage selbst zu beantworten
und es ist leider so, wie ich befürchtet habe.

Ich bin inzwischen soweit, das das Package tatsächlich nur im Mode mit Laufzeitbibliothek verwendet wird.
Auch wenn in der Liste nicht angegeben, werden von diesem Package implizit benötigte Packages (z.B. rtl,vcl)
stillschweigend als Laufzeitpackages deklariert und beim Programmstart nachgeladen.

Ist der Schalter Laufzeit nicht gesetzt werden BPL und DCR ignoriert. Der Compiler benötigt dann die in diesem Package enthaltenen DCU.
Es gibt allerdings eine wenig praktikable Ausnahme. Die teste ich gerade.
Wenn das Package als nicht visible Komponente installiert wird, dann verhält sich der Compiler wie erwartet und verwendet nur BPL/DCP.
Es ist aber bestimmt kein guter Programmierstil ( in Delphi) Programmkomponenten als nicht visible Komponenten in der IDE einzubinden.
In den Projekteinstellungen ist es leider nicht möglich projektbezogene Komponenten zu verwenden. (In VS geht das)

Gruß
Peter

chaosben 7. Mär 2010 17:03

Re: Verständnisfrage zu Laufzeitbibliotheken
 
Zitat:

Zitat von hanspeter
Gebe ich die BPL jetzt als Laufzeitbibliothek an (und nur diese), dann wird BPL/DCP auch ohne DCU gefunden
und verwendet.
Beim Programmstart wird diese Bibliothek automatisch mit geladen?

Ja, weil sie als Laufzeitbibliothek angegeben wurde

Zitat:

Zitat von hanspeter
Wenn ich jetzt keine weiteren Laufzeitbibliotheken angebe, welche VCL,rtl u.s.w. verwendet jetzt diese Bibliothek?

Die Bibliothek nutzt alle Bibliotheken, die sie braucht. :) Das siehst du entweder in deren Quellcode (requires) oder per Dependency-Walker.

Zitat:

Zitat von hanspeter
Werden die benötigten BPL implizit als Laufzeitbibliotheken geladen oder wird die bereits in das Projekt eingebundene Bibliothek verwendet?

Falls die Bibliothek die du nutzt, eine andere Bibliothek braucht, die schon geladen ist, wird die schon geladene genutzt. Wie bei DLL's eben. :)


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