Schwach Packen
Nach oben zu Liste der Delphi-Compiler-Direktiven - Index
|
Typ |
Option |
|
Syntax |
{$WEAKPACKAGEUNIT ON} oder {$WEAKPACKAGEUNIT OFF} |
|
Vorgabe |
{$WEAKPACKAGEUNIT OFF} |
|
Gültigkeitsbereich |
Lokal |
Bemerkungen
Die Direktive $WEAKPACKAGEUNIT beeinflusst die Art und Weise, in der eine DCU-Datei in den DCP- und BPL-Dateien eines Delphi-Package auf der Win32-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".
Angenommen, 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 eingebunden wird. Kopien von RARE.DLL müssen nicht mit PACK verteilt werden. UNIT1 ist jedoch weiterhin in PACK.DCP enthalten. Wenn andere Packages oder Anwendungen, die PACK verwenden, UNIT1 referenzieren, wird sie aus PACK.DCP 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 verwendet UNIT1. In diesem Fall wird UNIT1 selbst dann in PACK.BPL eingebunden, wenn UNIT1.PAS beim Compilieren von PACK die Direktive {$WEAKPACKAGEUNIT ON} enthält. Alle anderen Packages oder Anwendungen, die UNIT1 referenzieren, verwenden dagegen die nicht in ein Package eingebundene Kopie aus der Datei PACK.DCP.
Die Direktive $WEAKPACKAGEUNIT sollte nur von erfahrenen Entwicklern verwendet werden, die ihre Packages an andere Programmierer weitergeben möchten. 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.
Zum Beispiel referenziert die Unit "PenWin" von Delphi PENWIN.DLL. Diese Unit wird von den meisten Projekten nicht verwendet, und auf den meisten Computern ist PENWIN.DLL nicht installiert. Aus diesem Grund enthält VCL60 die Unit "PenWin" nur schwach gepackt (VCL60 kapselt viele gebräuchliche Delphi-Komponenten). Beim Compilieren eines Projekts, das "PenWin" sowie das VCL60-Package 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 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 Unit "PenWin" 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.