弱いパッケージ

提供: Appmethod Topics
移動先: 案内検索

Object Pascal コンパイラ指令のリスト:インデックス への移動


種類

スイッチ

構文

{$WEAKPACKAGEUNIT ON} または {$WEAKPACKAGEUNIT OFF}

デフォルト

{$WEAKPACKAGEUNIT OFF}

スコープ

ローカル

説明

$WEAKPACKAGEUNIT 指令は、.dcu ファイルが、Win32 プラットフォーム上で Object Pascal パッケージの .dcp および .bpl ファイルに格納される方法に影響します。 ユニット ファイルに {$WEAKPACKAGEUNIT ON} が記述されている場合、コンパイラは可能なときにパッケージ ライブラリ(.bpl)やダイナミック リンク ライブラリ(.dll)からユニットを省略し、他のアプリケーションやパッケージから必要とされたときに、そのユニットのパッケージ化していないローカル コピーを作成します。 この指令でコンパイルされたユニットを、「弱いパッケージ」と言います。

たとえば、PACK というパッケージを作成するとします。これには、ユニットが 1 つ(UNIT1)だけ含まれています。 UNIT1 は他のユニットを使用しませんが、RARE..dll を呼び出すと想定します。 パッケージをコンパイルする前に、UNIT1.pas に {$WEAKPACKAGEUNIT ON} 指令を挿入しておくと、UNIT1 は PACK.bpl に含まれません。 このため、RARE.dll のコピーを PACK と一緒に配布する必要がなくなります。 ただし、PACK.dcp には以前として UNIT1 が含まれています。 UNIT1 が、PACK を使用する別のパッケージやアプリケーションから参照されている場合は、PACK.dcp からそれがコピーされ、プロジェクトへ直接コンパイルされます。

ここで、2 つ目のユニット、UNIT2 を PACK に追加するとしましょう。 UNIT2 は UNIT1 を使用するとします。 この場合、PACK のコンパイル時に UNIT1.pas に {$WEAKPACKAGEUNIT ON} が指定されていたとしても、コンパイラは UNIT1 を PACK.bpl に含めます。 しかし、UNIT1 を参照する他のパッケージやアプリケーションは、UNIT1 のコピー(パッケージされていない)を PACK.dcp から取得します。

メモ: {$WEAKPACKAGEUNIT ON} 指令があるユニット ファイルには、グローバル変数、初期化セクション、終了処理セクションがあってはなりません。

{$WEAKPACKAGEUNIT} 指令は、他のプログラマにパッケージを配布する開発者向けの、上級機能です。 この機能により、頻繁に使用されない DLL の配布を避け、また、同じ外部ライブラリに依存する可能性のパッケージ間の衝突をなくすことができます。

たとえば、Object Pascal の PenWin ユニットは PenWin.dll を参照します。 大抵のプロジェクトは PenWin を使用せず、また、大抵のコンピュータにも PenWin.dll はインストールされていません。 このような理由から、PenWin ユニットは、VCL60(多くの一般に使用される Object Pascal コンポーネントをカプセル化したもの)に弱くパッケージングされています。 PenWin と VCL60 パッケージを使用するプロジェクトをコンパイルする場合は、PenWin は VCL60.dcp からコピーされ、使用するプロジェクトへ直接バインドされます。 その結果できあがった実行可能ファイルは、PenWin.dll へ静的にリンクされています。

PenWin が弱いパッケージとなっていない場合、2 つの問題が発生します。 第 1 に、VCL60 自身が静的に PenWin.dll とリンクされてしまうので、VCL60 を PenWin.dll がインストールされていないコンピュータに、一切ロードできなくなってしまいます。 第 2 に、PenWin を含むパッケージを作成しようとすると、PenWin ユニットが VCL60 と作成しようとしているパッケージの両方に含まれてしまうため、コンパイル エラーが発生します。 このように、弱いパッケージングなしでは、PenWin を標準配布される VCL60 に含むことはできません。

関連項目