方法でDLLを呼び出すの二つの方法Delphiの 比較
目的は、他のプログラムのためのDLL出力ルーチン呼び出しを記述することであるため、DLLのプロジェクトファイル内のルーチンは、出力リードアウト輸出は、キーワードすべきです。アプリケーションで同じ文の形式を宣言するためにDLL、DLLを宣言するために使用される方法、およびDLLを呼び出します。アクセスDLLは、2つの方法で静的および動的呼び出しのルーチンを呼び出します。静的呼び出しインタフェースの実施形態ルーチン外部ポインタを導入DLLからセルリストの一部であり、動的呼び出しモードはダイナミックルーチンで導入されたWindowsのAPI関数のLoadLibrary含まれ、GetProcAddressなどとFreeLibraryの機能のDLL関数を呼び出すことです。
以下のコードが必要な動的呼び出しよりも、静的な道を呼び出すために必要な、しかし、あなたはDLLが存在しない導入するDLLのルーチンをロードしたりしないようにしたい場合は、いくつかの欠点は、まず、ありますが、それは自動的に終了しますと、プログラムの実行、2 DLLが読み込まれると、DLLが不要になった場合でも、アプリケーションのアドレス空間内に存在していません。動的呼び出しは、必要性がFreeLibraryの機能により、メモリからアンロードLoadLibrary関数により導入されたDLLを使用する場合にのみ、それは、上記の問題を解決することができ、あなたは使用後GetProcAddress関数を呼び出すことによって、異なるルーチンを指定することができます。APIの呼び出しに指定されたDLLのエラー、アップが失敗した場合に最も重要なのは、プログラムが終了につながることはありません。以下の具体例は、本実施形態の呼び出しに記載の方法を用いて説明します。
1。静的呼び出し
DLLプログラムは、要求と2つの整数を得るために、DLLを呼び出して、2つの整数の入力メインプログラム内の2つの整数の関数を含むサンプルを作成します。
DLLのためのプログラムコードを次のように:
AddNumライブラリは、 使用 、sysutilsのを クラス; {$ R&LT * .RES} 関数AddNumber(Num1を、Num2を:整数):整数; _stdcall;で定義された//加算機能 始める 結果:; = + Num1をNum2を END; 輸出 AddNumber; //合計する関数リードが 始まる 終了。
メインプログラムはDLLを呼び出すと、最初のコールへの関数のインターフェイス部で宣言されました:
VAR をForm1:TForm1; 関数AddNum(Num1を、Num2を:整数):整数; STDCALL、外部'AddNum.dll'名前'AddNumber'。
そして、ボタンコントロールのイベントに次のコードを記述します。
TForm1.Button1Click手順(送信者:TObjectを); VAR 数値1、数値2:整数; 合計:整数; 開始 番号1:= strtoint(Edit1.Text); 数値2:= strtoint(Edit2.Text); 合計:= AddNum(数値1、数値2 ); //合計を呼び出す関数の結果 Edit3.Text:= IntToStr(合計); END;
2。動的な呼び出し
この例では、フォームが含まれている日付を示してDLLを作成します。
ShowCalendarプログラムは、この形式の日付セットを返す関数を定義します。この関数は次のように定義されています。
ShowCalendar機能(AHandle:THandle; ACaption:文字列):のTDateTime; VAR DLLForm:TDLLForm; 始める Application.Handle:; = AHandle := TDLLForm.Create(応用); //フォームを作成し、表示しDLLForm トライ DLLForm.Captionを:= ACaption; DLLForm.ShowModal; //表示模式として 結果:= DLLForm.calDLLCalendar.CalendarDate; //設定返却日 ついに DLLForm.Freeを; //疲れアンロードフォーム END; END;
DLLを使用してプロジェクトファイルでShowCalendarをエクスポートし、文が機能を開始します。DLLファイルをテストするための簡単なアプリケーションに従うこと。ボタンコントロールのOnClickイベントに次のコードを記述し、LabelコントロールとButtonコントロールを配置する形で、新しいプロジェクトファイルを作成します。
TMainForm.Button1Click手順(送信者:TObjectを); VARの OneHandle:THandle; //変数ハンドルを定義 始める OneHandle:= LoadLibraryの( 'Clendar.dll'); //動的ロードDLL、およびにそのハンドルを返す 試み OneHandle <> IFその後、0 //成功した関数のアドレスShowCalendar取得ロードされている場合 @ShowCalendar:=のGetProcAddress(OneHandle、 'ShowCalendarを'); IFない(@ShowCalendar = nilの)その後、 //メインフォームのLabel1が関数を見つけた場合には表示DLLフォームセットの日付 Label1.Caption:= DateToStr(ShowCalendar(Application.Handle、キャプション)) 他 RaiseLastWin32Error、 最終的 にFreeLibrary(OneHandle); //コール占有リソースDLL回復に完了し 、エンド; エンド;
上記プログラムは、DLLの中に見ることができるから動的呼び出し重要な利点の静的呼び出しより方法。DLLルーチンが使用される場合にのみ転送され、大幅にシステムリソースを低減すること、実行後にアンロードされます。LoadLibraryの関数を呼び出すときにパスなしている場合は、明示的に最初の実行時のディレクトリをロードするアプリケーションは、Windowsのシステムディレクトリへのパスとシステム環境変数のパスのセットを見つけ、DLLへのフルパスを指定することができます。