ダイナミック リンク ライブラリは、アプリケーションや他の DLL から呼び出すことができるプロシージャと関数のコレクションであり、パブリック コードまたはリソースが含まれています。 DLL コードはメモリ共有テクノロジを使用しているため、Windows はいくつかの場所で DLL に高いアクセス許可を与えます。そのため、DLL は、Windows HOOK、ISAPI などの実装など、通常のプログラムでは実現できないいくつかの機能を実装できます。同時に、DLL は、異なる言語間でコードを共有するための便利な方法も提供します。したがって、DLL はプログラミングで広く使用されています。この記事では、Delphi で DLL を作成して使用する方法を紹介します。
1つ。 DLL ライブラリのメモリ共有メカニズム
使用法の観点から見ると、DLL とユニットは非常に似ていますが、どちらも他のプロジェクト モジュールから呼び出すことができますが、内部実装メカニズムには違いがあります。プログラム モジュールが uses ステートメントを使用してユニットを参照する場合、コンパイラはモジュールをコンパイルするときに、ユニットと一緒にコンパイルし、コンパイルされた実行可能コードをプログラム モジュールにリンクします。これが、プログラム モジュールが呼び出す理由です。参照先のユニット内のプロシージャと関数。同じユニットが複数のプロジェクトから参照されている場合、各プロジェクトにはユニットの実行コードが含まれます。そのユニットを含む複数のプロジェクトが同時に実行されると、ユニットの実行コードは異なるプロジェクトで複数回更新されます。メモリに書き込まれるため、メモリ リソースが無駄に消費されます。 DLL は、特定のプロジェクトから呼び出されても、コンパイル後は独立したものになります。つまり、DLL ライブラリは、コンパイル後に別の実行可能ファイルを形成し、他の実行可能ファイルとは結合されません。 DLL ライブラリは特定のプロジェクトに従属しません。複数のプロジェクトが同じ DLL ライブラリを呼び出す場合、最初のプロジェクトだけが DLL ライブラリをメモリに転送し、他のプロジェクトは同じ DLL ライブラリを繰り返しメモリに転送しません。同じ共有メモリ領域。さらに、DLL の実行コードは、プログラムの実行時にプロジェクト全体とともにメモリに転送されるのではなく、プログラムの実行中に動的に転送されます。これにより、同じコードが複数の場所でメモリを占有するというユニットに起因するデメリットを解消できます。
2. DelphiでのDLLライブラリの作成
Delphi 環境では、DLL の作成は一般的なアプリケーションの作成とそれほど変わりません。実際、DLL 本体となる DLL 関数の記述には、メモリとリソース管理の違いを除けば、特別な手段は必要ありません。
一般的なプロジェクト ファイルの形式は次のとおりです。
プログラムプロジェクトのタイトル;
uses 句。
プログラム本体
DLL プロジェクト ファイルの形式は次のとおりです。
ライブラリプロジェクトのタイトル。
uses 句。
exprots 節。
プログラム本体
それらの間には 2 つの主な違いがあります。
1. 通常、プロジェクト ファイルのヘッダーにはプログラム キーワードが使用され、DLL プロジェクト ファイルのヘッダーにはライブラリ キーワードが使用されます。キーワードが異なれば、コンパイラーは異なる実行可能ファイルを生成します。 Program キーワードは .exe ファイルの生成に使用され、library キーワードは .dll ファイルの生成に使用されます。
2. DLL が他のアプリケーションで使用するために関数またはプロシージャをエクスポートする場合、これらの関数またはプロシージャをエクスポート句にリストする必要があります。これらの関数またはプロシージャ自体は、export コンパイル ディレクティブを使用してコンパイルする必要があります。
Delphi メイン メニュー ファイルで新しい... 項目を選択し、ポップアップ ウィンドウで DLL アイコンをダブルクリックすると、次のように DLL ソース モジュール フレームワークが自動的に提供されます。
ライブラリプロジェクト1;
{...注釈...}
用途
SysUtils、クラス;
始める
終わり。
次に、USES と begin の間の DLL に実装するプロシージャと関数の定義を追加し、export とexports を使用してそれらをエクスポートし、他のモジュールがそれらを参照できるようにします。初期化コードを begin と end の間に追加します。 DLL変数を初期化するために使用されます。初期化コードがない場合でも、次の例のように begin と end を省略できないことに注意してください。
ライブラリ最小最大;
functionMin(X,Y:Integer):Integer;エクスポート;
始める
ifX<YthenMin:=XelseMin:=Y;
終わり;
functionMax(X,Y:Integer):Integer;エクスポート;
始める
ifX>YthenMax:=XelseMax:=Y;
終わり;
輸出
最小インデックス 1、
最大インデックス2;
始める
終わり。
コンパイルして minmax.DLL として保存すると、DLL ライブラリ ファイルが形成されます。
3 つの DLL ライブラリへのアクセス
DLL ライブラリにアクセスするには 2 つの方法があり、1 つは静的参照、もう 1 つは動的参照です。
静的参照メソッドを使用して DLL をロードするには、DLL ライブラリの入力ユニットを作成することと、USES を使用して入力ユニットを DLL 関数を使用するプログラム モジュールに接続することの 2 つの作業が必要です。 DLL ライブラリ用に作成された入力ユニットと通常のユニットの唯一の違いは、そのインターフェイスで宣言されたプロシージャと関数が実装部分で実際の実装コードを与えないことです。代わりに、external キーワードを使用してプロシージャと関数を宣言します。実装の詳細は外部 DLL モジュールに委任されます。
外部コマンドを使用するための構文は次のとおりです。
プロシージャ/関数 プロシージャ/関数名; externalDLL モジュール名;
以下は、上で作成した minmax.DLL ライブラリ用に記述された入力ユニットのソース ファイル testdll.pas です。コードは次のとおりです。
ユニットテストdll;
インタフェース
用途
functionMin(X,Y:整数):整数;
functionMax(X,Y:整数):整数;
実装
functionMin;外部'minmax.DLL';
functionMax;外部'minmax.DLL';
終わり。
アプリケーションが minmax.DLL 内の関数を呼び出したい場合は、testdll ユニットを uses ステートメントに追加するだけで済みます。
DLL を動的にロードするには、Windows の 3 つの API 関数が必要です。 Loadlibrary、Freelibrary、GetprocAddress。 DLL ライブラリをロードするには、loadlibrary 関数を使用します。その呼び出し形式は次のとおりです。
functionloadlobrary(DLLfileName:Pchar):THandle:
DLL ライブラリが不要になった場合は、FreeLibrary 関数を呼び出して貴重なメモリ リソースを解放する必要があります。呼び出し形式は次のとおりです。
プロシージャFreeLibrary(Libmodule:THandle)
Libmodule は、LoadLibrary 呼び出しによって取得される DLL ライブラリ ハンドルです。 loadlobrary 関数を使用して DLL ライブラリをロードしてから、FreeLibrary を呼び出して DLL ライブラリを解放するまでのプログラム セグメントでは、DLL ライブラリのプロシージャと関数を使用できます。具体的な使用方法は、GetprocAddress 関数を使用してアドレスを取得することです。 DLL ライブラリ内の関数をプログラム内の関数変数に渡し、その変数を使用して DLL 関数を呼び出します。 GetprocAddress 関数は次のように宣言されます。
functionGetprocAddress(Libmodule:THandle:procname:pchar):TFarProc:
次の例に示すように:
タイプ
TTimeRec=レコード
2 番目:整数;
分:整数;
時間:整数;
終わり;
TGetTime=プロシージャ(varTime:TTimeRec);
THandle=整数;
変数
時間:TTimeRec;
ハンドル:Tハンドル;
GetTime:TGetTime;
...
始める
ハンドル:=LoadLibrary('DATETIME.DLL');
ifHandle<>0then
始める
@GetTime:=GetProcAddress(ハンドル,'GetTime');
if@GetTime<>nilthen
始める
GetTime(時間);
withTimedo
WriteLn('時刻',時,':',分,':',秒);
終わり;
FreeLibrary(ハンドル);
終わり;
終わり;
ダイナミック リンク ライブラリを呼び出すときは、必要なダイナミック リンク ライブラリがアプリケーションと同じディレクトリ、または WindowsSystem ディレクトリに存在する必要があることに注意してください。
ダイナミック リンク ライブラリは、Windows でプログラムを編成するための重要な方法です。ダイナミック リンク ライブラリを使用すると、さまざまな開発ツールやさまざまな期間でのユーザーの作業を大幅に保護し、プログラミングの効率を向上させることができます。