Schwach Packen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Liste der Delphi-Compiler-Direktiven - Index


Typ

Option

Syntax

{$WEAKPACKAGEUNIT ON} oder {$WEAKPACKAGEUNIT OFF}

Vorgabe

{$WEAKPACKAGEUNIT OFF}

Bereich

Lokal



Anmerkungen

Mit der Direktive $WEAKPACKAGEUNIT können Sie steuern, wie eine .dcu-Datei in den .dcp- und .bpl-Dateien von Delphi-Packages auf der Win32-Plattform bzw. wie eine .dcuil-Datei in den .dcpil- und .dll-Dateien von Packages auf der .NET-Plattform gespeichert wird. Die Direktive {$WEAKPACKAGEUNIT ON} in einer Unit-Datei veranlasst den Compiler, diese Unit wenn möglich nicht in .bpl- oder .dll-Dateien einzubinden. Er erzeugt stattdessen eine nicht an das Package gebundene lokale Kopie der Unit, wenn diese von einer anderen Anwendung oder einem anderen Package benötigt wird. Eine solche Unit bezeichnet man als schwach gepackt.

Nehmen wir an, ein Package namens PACK enthält nur eine Unit mit dem Namen UNIT1. UNIT1 nutzt keine weiteren Units, ruft aber RARE.DLL auf. Wenn nun vor dem Compilieren die Direktive {$WEAKPACKAGEUNIT ON} in UNIT1.pas eingefügt wird, führt dies dazu, dass UNIT1 nicht in PACK.BPL (oder PACK.DLL unter .NET) aufgenommen wird. Kopien von RARE.DLL müssen nicht mit PACK verteilt werden. Dagegen ist UNIT1 weiterhin in PACK.dcp (oder PACK.dcpil unter .NET) enthalten. Wenn andere Packages oder Anwendungen, die PACK benutzen, UNIT1 referenzieren, wird sie aus PACK.dcp (oder PACK.dcpil unter .NET) kopiert und direkt in das Projekt compiliert.

Nehmen wir nun an, dass eine weitere Unit mit dem Namen UNIT2 zu PACK hinzugefügt wird. UNIT2 greift auf UNIT1 zu. In diesem Fall wird UNIT1 selbst dann in PACK.BPL (oder PACK.DLL unter .NET) eingebunden, wenn UNIT1.pas beim Compilieren von PACK die Direktive {$WEAKPACKAGEUNIT ON} enthält. Alle anderen Packages oder Anwendungen, die sich auf UNIT1 beziehen, verwenden dagegen die nicht in ein Package eingebundene Kopie aus der Datei PACK.dcp (oder PACK.dcpil unter .NET).

Anmerkung:  Unit-Dateien, welche die Direktive {$WEAKPACKAGEUNIT ON} verwenden, dürfen keine globalen Variablen und Abschnitte zur Initialisierung und Finalisierung enthalten.

Die Direktive $WEAKPACKAGEUNIT sollte nur von erfahrenen Entwicklern verwendet werden, die ihre Packages an andere Programmierer weitergeben wollen. Sie können mit dieser Direktive vermeiden, dass weniger gebräuchliche DLLs verteilt werden. Außerdem werden Konflikte zwischen Packages eliminiert, die von derselben externen Bibliothek abhängig sind.

Beispielsweise referenziert die PenWin-Unit von Delphi die Datei PENWIN.DLL. Die meisten Projekte benutzen PenWin nicht, und auf den meisten Computern ist PENWIN.DLL nicht installiert. Aus diesem Grund enthält VCL60 die PenWin-Unit nur schwach gepackt (VCL60 kapselt viele gebräuchliche Delphi-Komponenten). Beim Compilieren eines Projekts, das PenWin sowie das VCL60-Packages nutzt, wird PenWin aus VCL60.DCP kopiert und direkt in das Projekt eingebunden; die resultierende ausführbare Datei wird statisch zu PENWIN.DLL gelinkt.

Wäre PenWin nicht schwach gepackt, würden sich zwei grundsätzliche Probleme ergeben. Erstens würde VCL60 selbst statisch zu PENWIN.DLL gelinkt und könnte somit nur geladen werden, wenn PENWIN.DLL installiert ist. Zweitens würde bei dem Versuch, PenWin in ein Package einzubinden, ein Compiler-Fehler auftreten, weil die PenWin-Unit sowohl in VCL60 als auch im neuen Package enthalten wäre. Somit könnte PenWin ohne schwaches Packen nicht in Standarddistributionen von VCL60 enthalten sein.

Siehe auch