$WeakPackageUnit Compiler Directive
Use $WeakPackageUnit
in a unit that is contained in a
package when the following criteria are true:
The package will be used in a variety of applications.
The unit is not used by most of those applications.
The unit requires a DLL that most users do not already have.
Ordinarily, the package requires the DLL because the unit requires it. This means an application that uses the package also requires the DLL. In other words, the application vendor must ship the DLL with the application even though the application does not use the DLL.
$WeakPackageUnit
solves this problem by linking
the unit “weakly” with the package. Specifically, the
unit is not actually linked into the package’s
.bpl file. Instead, the unit is contained
entirely in the .dcp file, which usually stores
only the interface part of a unit. If an application does not use the
unit, the unit is not linked with the application, and the
application does not require the unit’s associated DLL. If the
application does use the unit, the unit is linked statically with the
application, and the application requires the unit’s DLL.
If the package contains another unit (Unit2
) that
uses the weak unit (Unit1
),
Unit2
breaks the “weakness”
constraints. An application that uses the package always links with
Unit2
(because Unit2
is always
in the package), which requires Unit1
, which
requires the DLL. Thus, a weak unit must stand alone in the package
so the weak linking can work correctly.
A weak unit cannot contain any global variables, an initialization section, or a finalization section.
$WeakPackageUnit
has a lot of limitations, and its
use is limited. In the few cases where it is needed, though, it is
absolutely necessary. If you are not writing packages to sell to
other Delphi developers, you don’t need to concern yourself
with this directive at all.