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