静的 vs 動的 動的リンク ライブラリの読み込み
オマールハバナ/ゲッティイメージズ
DLL (ダイナミック リンク ライブラリ) は、多数のアプリケーションや他の DLL から呼び出すことができる関数の共有ライブラリとして機能します。 Delphi では、 DLL の作成と使用 これらの関数を自由に呼び出すことができるようにします。ただし、これらのルーチンを呼び出す前にインポートする必要があります。
DLL からエクスポートされた関数は、外部プロシージャまたは関数を宣言する (静的) か、DLL 固有の API 関数を直接呼び出す (動的) という 2 つの方法でインポートできます。
簡単な DLL を考えてみましょう。以下は、指定された半径を使用して円の面積を計算する「CircleArea」と呼ばれる 1 つの関数をエクスポートする「circle.dll」のコードです。
circle.dll を取得したら、アプリケーションからエクスポートされた「CircleArea」関数を使用できます。
静的荷重
プロシージャまたは関数をインポートする最も簡単な方法は、外部ディレクティブを使用して宣言することです。
この宣言をユニットのインターフェイス部分に含めると、プログラムの起動時に circle.dll が 1 回読み込まれます。プログラムの実行中、関数 CircleArea は、上記の宣言があるユニットを使用するすべてのユニットで使用できます。
動的ローディング
Win32 API への直接呼び出しを介して、ライブラリ内のルーチンにアクセスできます。 LoadLibrary 、 無料ライブラリ 、 と GetProcAddress .これらの関数は、Windows.pas で宣言されています。
動的読み込みを使用して CircleArea 関数を呼び出す方法は次のとおりです。
動的読み込みを使用してインポートする場合、DLL は LoadLibrary への呼び出しまで読み込まれません。ライブラリは FreeLibrary への呼び出し .
静的読み込みでは、DLL が読み込まれ、呼び出し元のアプリケーションの初期化セクションが実行される前に、その初期化セクションが実行されます。これは、動的ロードで逆になります。
静的または動的を使用する必要がありますか?
静的および動的 DLL ロードの長所と短所を簡単に見てみましょう。
静的荷重
長所:
- 初心者の開発者にとっては簡単です。いいえ「醜い」API 呼び出し.
- DLL は、プログラムの開始時に一度だけロードされます。
短所:
- DLL が欠落しているか見つからない場合、アプリケーションは起動しません。次のようなエラー メッセージが表示されます。 「「missing.dll」が見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションを再インストールすると、この問題が解決する場合があります。」 設計上、静的リンクを使用した DLL 検索順序には、アプリケーションのロード元のディレクトリ、システム ディレクトリ、Windows ディレクトリ、および PATH 環境変数にリストされたディレクトリが含まれます。検索順序は、Windows のバージョンによって異なる場合があることにも注意してください。呼び出し元のアプリケーションがあるディレクトリにすべての DLL があることを常に期待してください。
- 一部の .functions を使用しない場合でも、すべての DLL がロードされるため、より多くのメモリが使用されます。
動的ローディング
長所:
- 使用するライブラリの一部が存在しない場合でも、プログラムを実行できます。
- DLL は必要な場合にのみ使用されるため、メモリ消費量が少なくなります。
- DLL へのフル パスを指定できます。
- モジュラーアプリケーションに使用できます。アプリケーションは、ユーザーに対して「承認された」モジュール (DLL) のみを公開 (ロード) します。
- ライブラリを動的にロードおよびアンロードする機能は、開発者がプログラムに追加機能を追加できるプラグイン システムの基盤です。
- システム DLL が同じ機能をサポートしていない、または同じ方法でサポートされていない古い Windows バージョンとの後方互換性。最初に Windows のバージョンを検出し、次にアプリが実行されているものに基づいて動的にリンクすることで、より多くのバージョンの Windows をサポートし、古い OS の回避策を提供できます (または、少なくとも、サポートできない機能を適切に無効にします)。
短所:
- より多くのコードが必要であり、初心者の開発者にとって常に簡単であるとは限りません。