Delphi Programming / Object Pascal

[掲載 2022年09月23日] [更新 2022年09月23日] Delphi 一般・その他 |
| DLL の作成 |
| 動作確認等 |
Windows 10 ビルド 19043 Pro 64 bit + Delphi XE5(UP2) Pro VCL-32 |
Delphi で DLL を新規に作成する手順と、簡単なサンプル作成の記事です。 |
[備考]
32 ビットの DLL は、64 ビットの EXE では使用できません。64 ビットの DLL は 32 ビットの EXE では使用できません。 |
[ファイル] [新規作成] で [その他] を選択します。起動したダイアログの左ペインの [Delphi プロジェクト] を選択して、右ペインの [ダイナミックリンクライブラリ]、つまり、DLL を選択します。 |
 |
図1
[新規作成] [その他] のダイアログ
- 左ペインの
[Delphi プロジェクト] を選択
- 右ペインの
[ダイナミックリンクライブラリ] を選択
|
プロジェクトのコードを以下のようにします。
この DLL は、整数の加算と実数の乗算の関数だけを実装しています。
stdcall は、関数類の引数などの内部処理の、Pascal における呼び出し規約です。Windows API でもデファクトスタンダードの呼出規約となっています。DLL 内の関数を使用する際の一種の「おまじない」ぐらいに考えても差支えありません。
exports には、外部から使用可能な関数名を列挙します。ここに列挙した関数や手続きだけが外部から利用できます。 |
library SampleDLL;
uses
System.SysUtils,
System.Classes;
function AddValue(Val1, Val2: Integer): Integer; stdcall;
begin
Result := Val1 + Val2;
end;
function MulValue(Val1, Val2: Double): Double; stdcall;
begin
Result := Val1 * Val2;
end;
exports
AddValue,
MulValue;
begin
end.
[ファイル] [プロジェクトに名前を付けて保存] で任意のフォルダに保存します。今回は S
ampleDLL という名前で保存しています。保存したら、[Ctrl] + [F9] でコンパイルします。DLL が作成されます。
下図は、出力先ディレクトリを . に変更してコンパイルした結果です。デフォルトの出力先は [Win21] フォルダの階層下です。これは、EXE ができる場所と同じです。
これで DLL の作成は終了です。Delphi の IDE を閉じます。 |
 |
図2
保存してコンパイルした結果
- DLL が作成されている
- SampleDLL.lpr がプロジェクトファイル
|
必要であれば、DLL のプロジェクトにユニットを追加できます。
新規にユニットを追加するには、[ファイル] [新規作成] [ユニット] で追加します。既存のユニットを裁可するには、[プロジェクト] [プロジェクトに追加] で追加します。 |
新規に VCL フォームアプリケーションを作成します。
フォームに TButton を 2 つ配置します。フォームのユニットのコードを、図の下のコードにします。 このプロジェクトを、DLL のプロジェクトのファイルと同じフォルダ内に保存します。[F9] で実行します。下図はその結果です。 今回は、DLL を EXE と同じフォルダ内に置いてテストしています。
DLL の関数や手続きの宣言は、implementation 部に記述しても構いません。
external 指令は、この関数を外部から呼び込むことを意味しています。その後の文字列が、その関数が存在する DLL の名前です。 |
 |
図3
[Button1] クリック
|
 |
図4
[Button2] クリック
|
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
function AddValue(AVal1, AVal2: Integer): Integer; stdcall; external 'SampleDLL.dll';
function MulValue(AVal1, AVal2: Double): Double; stdcall; external 'SampleDLL.dll';
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
LValue : Integer;
LText : string;
begin
LValue := AddValue(3000, 500);
LText := '計算結果' + sLineBreak + FormatFloat(',0', LValue);
MessageBox(Handle, PChar(LText), '情報', MB_ICONINFORMATION);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
LValue : Double;
LText : string;
begin
LValue := MulValue(3000, 500);
LText := '計算結果' + sLineBreak + FormatFloat(',0.000', LValue);
MessageBox(Handle, PChar(LText), '結果', MB_ICONINFORMATION);
end;
end.
DLL は EXE が実行時に使用するファイルです。したがって、DLL は、システム的にパスが通った場所に存在している必要があります。EXE が最初に探しに行くのは EXE があるフォルダです。次に EXE が探しに行くのは、下表のシステムフォルダです。
64 ビット版の Windows の場合は、32 ビットの EXE は SysWOW64 内を探に行きます。64 ビットの EXE は System32 内を探しに行きます。32 ビット版の Windows の場合は、常に System32 内を探しに行きます。32 ビット版の Windows では、64 ビットの EXE は実行できません。
DLL を動的にロードして使用する場合は、任意のフォルダに置いて利用できます。 |
| フォルダ |
説明 |
| %SystemRoot%\system32 |
64 ビット版の Windows 7 では 64 ビット用のシステムフォルダ
32 ビット版の Windows では 32 ビット用のシステムフォルダ
実フォルダ名は Windows\System32
64 ビット版の Windows では、このフォルダを指定しても、32 ビットのアプリは %SystemRoot%\SysWOW64 内のファイルを使用する (リダイレクト機能による) |
| %SystemRoot%\SysWOW64 |
64 ビット版の Windows では 32 ビット用のシステムフォルダ
32 ビット版の Windows にはない
実フォルダ名は Windows\SysWOW64
32 ビットのアプリは、%SystemRoot%\system32 を指定しても自動的にこちらにリダイレクトされる
|
一方、コンポーネントなどのユニットファイルは、コンパイルして EXE を作成する時に必要なファイルです。つまり、開発時、設計時に必要なファイルです。これらは、ライブラリパスが通った場所に必要です。ライブラリパスというのは、IDE が認識可能なフォルタということになります。IDE が最初に探しに行くのは、プロジェクトファイルがあるフォルダです。
一般敵に、当サイトの記事もそうですが、アプリ開発時の関係の記事では、ライブラリパスのことを、単にパスと言うことがあります。 |
[備考]
64 ビット版の Windows の 64 ビット用のシステムフォルダは System32 です。
64 ビット版の Windows の 32 ビット用のシステムフォルダは、SysWOW64 です、
末尾の 32, 64 は、実際のビットではありません。WOW64 は、[ Windows on Win64 ] ( 64 bit の Windows で 32 bit のウィンドウ ) の意味です。
Windows が 32 ビット版であるか、64 ビット版であるかは、以下のリンクをクリックするか、コマンドとして実行したダイアログの、[システムの種類] で確認できます、
ms-settings:about |
|