Verwendung des schwachen Packens
Nach oben zu Packages compilieren
In Delphi:
Die Direktive $WEAKPACKAGEUNIT beeinflusst die Art und Weise, in der eine DCU-Datei in den DCP- und BPL-Dateien eines Package gespeichert wird. (Detaillierte Informationen über die vom Compiler erzeugten Dateien finden Sie unter Packages und Standard-DLLs.) Die Direktive {$WEAKPACKAGEUNIT ON} in einer Unit-Datei veranlasst den Compiler, diese Unit, wenn möglich, nicht in Packages 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, Sie haben ein Package mit dem Namen "pack1" erzeugt, das als einzige Unit "unit1" enthält. "unit1" verwendet keine weiteren Units, ruft aber "rare.dll" auf. Wenn unit1.pas (Delphi) oder unit1.cpp (C++) die Direktive {$WEAKPACKAGEUNIT ON} enthält und Sie das Package compilieren, wird "unit1" nicht in pack1.bpl eingebunden, und Sie brauchen zusammen mit "pack1" keine Kopien von "rare.dll" weiterzugeben. "unit1" wird jedoch nach wie vor in pack1.dcp eingebunden. Andere Packages oder Anwendungen, die "unit1" referenzieren, verwenden die nicht gepackte Kopie aus pack1.dcp.
Angenommen, Sie fügen dem Package "pack1" eine zweite Unit namens "unit2" hinzu. "unit2" verwendet "unit1". In diesem Fall wird "unit1" selbst dann in pack1.dcp eingebunden, wenn unit1.pas beim Compilieren von "pack1" 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 pack1.dcp.
Hinweis: Unit-Dateien, die die Direktive {$WEAKPACKAGEUNIT ON} verwenden, dürfen keine globalen Variablen und Abschnitte zur Initialisierung und Finalisierung enthalten.
Mit der Direktive {$WEAKPACKAGEUNIT} stehen Entwicklern, die ihre Packages anderen Programmierern zugänglich machen möchten, umfangreiche Möglichkeiten zur Verfügung. So wird beispielsweise die Weitergabe selten verwendeter DLLs überflüssig, und Konflikte zwischen Packages, die von derselben externen Bibliothek abhängig sind, lassen sich leichter vermeiden.
Die Unit "PenWin" referenziert beispielsweise die Datei PenWin.dll. Diese Unit wird von den wenigsten Projekten verwendet, und auf den wenigsten Computern ist PenWin.dll installiert. Aus diesem Grund ist die Unit "PenWin" in "vcl" nur schwach gepackt. Beim Compilieren eines Projekts, das die Unit "PenWin" und das Package "vcl" referenziert, wird "PenWin" aus der Datei vcl70.dcp kopiert und direkt in das Projekt eingebunden. Die resultierende ausführbare Datei ist statisch mit PenWin.dll verknüpft.
Wäre "PenWin" nicht schwach gepackt, würden sich zwei grundsätzliche Probleme ergeben. Erstens würde "vcl" selbst statisch zu PenWin.dll gelinkt, was zur Folge hätte, dass "vcl" auf Computern, auf denen PenWin.dll nicht installiert ist, nicht mehr geladen werden könnte. Zweitens würde der Compiler den Versuch zurückweisen, ein Package zu erzeugen, das "PenWin" enthält, da die Unit "PenWin" sowohl in "vcl" als auch in Ihrem eigenen Package enthalten wäre. Ohne schwaches Packen könnte "PenWin" also nicht so einfach mit Standardversionen von "vcl" weitergegeben werden.
In C++Builder:
Die Direktive #pragma package(smart_init, weak)
beeinflusst die Art, wie eine OBJ-Datei in BPI- und BPL-Dateien eines Packages gespeichert wird. (Detaillierte Informationen über die vom Compiler und Linker erzeugten Dateien finden Sie unter Packages und Standard-DLLs.) Wenn #pragma package(smart_init, weak)
in einer Unit-Datei enthalten ist, lässt der Linker, wenn möglich, die Unit aus BPLs weg. Der Linker legt eine lokale Kopie der Unit (ohne Package) an, wenn die Unit für eine andere Anwendung oder ein anderes Package erforderlich ist. Eine solche Unit bezeichnet man als "schwach gepackt".
Angenommen, Sie haben ein Package mit dem Namen PACK erzeugt, das als einzige Unit "UNIT1" enthält. UNIT1 verwendet keine weiteren Units, ruft aber RARE.dll auf. Wenn Sie #pragma package(smart_init, weak)
in UNIT1.cpp einfügen, wird UNIT1 beim Erzeugen Ihres Package nicht in PACK.bpl einbezogen; Sie müssen keine Kopien von RARE.dll mit PACK weitergeben. Dagegen ist UNIT1 weiterhin in PACK.bpi enthalten. Wenn andere Packages oder Anwendungen, die PACK verwenden, UNIT1 referenzieren, wird sie aus PACK.bpi kopiert und direkt in das Projekt gelinkt.
Angenommen, Sie fügen PACK eine zweite Unit namens "UNIT2" hinzu. UNIT2 verwendet UNIT1. In diesem Fall schließt der Linker UNIT1 in PACK.bpl ein, auch wenn Sie PACK mit #pragma package(smart_init, weak)
in UNIT1.cpp compilieren. Aber andere Packages oder Anwendungen, die UNIT1 referenzieren, verwenden die Kopie (ohne Package) aus PACK.bpi.
Hinweis: Unit-Dateien mit der Direktive
#pragma package(smart_init, weak)
dürfen keine globalen Variablen enthalten.
#pragma package(smart_init, weak)
sollte nur von erfahrenen Entwicklern verwendet werden, die ihre Packages an andere C++Builder-Programmierer weitergeben möchten. So wird beispielsweise die Weitergabe selten verwendeter DLLs überflüssig, und Konflikte zwischen Packages, die von derselben externen Bibliothek abhängig sind, lassen sich leichter vermeiden.
Die Unit "PenWin" referenziert beispielsweise die Datei PenWin.dll. Diese Unit wird von den wenigsten Projekten verwendet, und auf den wenigsten Computern ist PenWin.dll installiert. Aus diesem Grund ist die Unit "PenWin" in "vcl" nur schwach gepackt. Beim Linken eines Projekts, das die Unit "PenWin" und das Package "vcl" referenziert, wird "PenWin" aus der Datei vcl60.bpi kopiert und direkt in das Projekt eingebunden. Die resultierende ausführbare Datei ist statisch mit PenWin.dll verknüpft.
Wäre "PenWin" nicht schwach gepackt, würden sich zwei grundsätzliche Probleme ergeben. Erstens würde "vcl" selbst statisch zu PenWin.dll gelinkt, was zur Folge hätte, dass "vcl" auf Computern, auf denen PenWin.dll nicht installiert ist, nicht mehr geladen werden könnte. Zweitens würde ein Build-Fehler auftreten, wenn Sie versuchen, ein Package zu erzeugen, das "PenWin" enthält, da die Unit "PenWin" sowohl in "vcl" als auch in Ihrem eigenen Package enthalten wäre. Ohne schwaches Packen könnte "PenWin" also nicht so einfach mit Standardversionen von "vcl" weitergegeben werden.
Siehe auch
- Packages und Komponenten: Übersicht
- Packages compilieren
- Spezielle Compiler-Direktiven für Packages
- Schwach Packen Compilier-Direktive für Delphi