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 |
|