Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2022年09月23日] [更新 2022年09月23日] Delphi 一般・その他
DLL の作成
動作確認等 Windows 10 ビルド 19043 Pro 64 bit + Delphi XE5(UP2) Pro VCL-32
[整理番号 - 1178]







DLL の作成


Delphi で DLL を新規に作成する手順と、簡単なサンプル作成の記事です。



[備考]
32 ビットの DLL は、64 ビットの EXE では使用できません。64 ビットの DLL は 32 ビットの EXE では使用できません。




01_DLL を新規作成


[ファイル] [新規作成] で [その他] を選択します。起動したダイアログの左ペインの [Delphi プロジェクト] を選択して、右ペインの [ダイナミックリンクライブラリ]、つまり、DLL を選択します。



図1
[新規作成] [その他] のダイアログ
  • 左ペインの
    [Delphi プロジェクト] を選択
  • 右ペインの
    [ダイナミックリンクライブラリ] を選択

プロジェクトのコードを以下のようにします。
この DLL は、整数の加算と実数の乗算の関数だけを実装しています。

stdcall は、関数類の引数などの内部処理の、Pascal における呼び出し規約です。Windows API でもデファクトスタンダードの呼出規約となっています。DLL 内の関数を使用する際の一種の「おまじない」ぐらいに考えても差支えありません。
exports には、外部から使用可能な関数名を列挙します。ここに列挙した関数や手続きだけが外部から利用できます。



リスト1
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 のプロジェクトにユニットを追加できます。
新規にユニットを追加するには、[ファイル] [新規作成] [ユニット] で追加します。既存のユニットを裁可するには、[プロジェクト] [プロジェクトに追加] で追加します。





02_DLL を使用するプログラムを作成して実行


新規に VCL フォームアプリケーションを作成します。
フォームに TButton を 2 つ配置します。フォームのユニットのコードを、図の下のコードにします。 このプロジェクトを、DLL のプロジェクトのファイルと同じフォルダ内に保存します。[F9] で実行します。下図はその結果です。 今回は、DLL を EXE と同じフォルダ内に置いてテストしています。

DLL の関数や手続きの宣言は、implementation 部に記述しても構いません。
external 指令は、この関数を外部から呼び込むことを意味しています。その後の文字列が、その関数が存在する DLL の名前です。



図3
[Button1] クリック
  • DLL 内の関数 AddValue を実行
図4
[Button2] クリック
  • DLL 内の関数 MulValue を実行

リスト2
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.




03_DLL の置き場所


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