Delphi Programming / Object Pascal

[掲載 2022年09月01日] [更新 2022年09月01日] Delphi 一般・その他 |
| Lazarus で DLL を作成 |
| 動作確認等 |
Windows 10 ビルド 19043 Pro 64 bit + lazarus-2.0.12 32 bit |
Lazarus で、DLL を新規に作成する手順と、簡単なサンプル作成の記事です。 |
[備考]
Lazarus で 作成した DLL は、他のプログラミング言語でも利用できますが、C# など、.NET 用言語では特別な処理が必要です。
64 ビット版の Lazarus で作成した DLL は、32 ビットの EXE では使用できません。32 ビット版の Lazarus で作成した DLL は、64 ビットの EXE てば使用できません。 |
IDE のメニューの [プロジェクト] から [新規プロジェクト] を選択します。下図のダイアログが起動します。このダイアログの左ペインの [ライブラリ] をダブルクリックするか、選択して [OK] ボタンで閉じると、新規の DLL 作成の状態になります。 |
 |
図1
DLL の新規作成
|
プロジェクトのコードを以下のようにします。
この DLL は、整数の加算と実数の乗算の関数だけを実装しています。
stdcall は、関数類の引数などの内部処理の、Pascal における呼び出し規約です。Windows API でもデファクトスタンダードの呼出規約となっています。DLL 内の関数を使用する際の一種の「おまじない」ぐらいに考えても差支えありません。
exports には、外部から使用可能な関数名を列挙します。ここに列挙した関数や手続きだけが外部から利用できます。 |
library SampleDLL;
{$mode objfpc}{$H+}
uses
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.
[プロジェクト] [名前を付けてプロジェクトを保存] で、SampleDLL.lpr という名前で、任意のフォルダに保存します。
保存したら [Ctrl] + [F9] でコンパイルしてIDE を閉じます。
下図は、保存されたファイルの一覧です。 |
 |
図2
保存してコンパイルした結果
- DLL が作成されている
- SampleDLL.lpr がプロジェクトファイル
|
Lazarus の IDE を起動したら、[プロジェクト] [新規プロジェクト] を選択します。前項と同じダイアログが起動します。左ペインから [アプリケーション] を選択します。
この操作は、プロジェクトの新規作成状態で Lazarus が起動している場合は必要ありません。
フォームに TButton を 2 つ配置して、Unit1 のコードを、図の下のコードにします。Windows API の関数を使用すために、uses に LazUTF8, Windows を追加しています。DLL 内の関数を他のユニットで使用する必要がなければ、関数の宣言を implementation 部に記述しても構いません。
external 指令は、この関数を外部から呼び込むことを意味しています。その後の文字列が、その関数が存在する DLL の名前です。
このプロジェクトを、[プロジェクト] [名前を付けてプロジェクトを保存] で、DLL のプロジェクトファイルと同じフォルダ内に保存します。保存したら [F9] でコンパイルして実行します。
下図が実行結果です。 |
 |
図3
[Button1] クリック
|
 |
図4
[Button2] クリック
|
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
LazUTF8, Windows;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
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 *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
LValue : Integer;
LText : string;
LCap : string;
begin
LValue := AddValue(3000, 500);
LText := UTF8ToWinCP('計算結果' + sLineBreak + FormatFloat(',0', LValue));
LCap := UTF8ToWinCP('情報');
MessageBox(Handle, PChar(LText), PChar(LCap), MB_ICONINFORMATION);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
LValue : Double;
LText : string;
LCap : string;
begin
LValue := MulValue(3000, 500);
LText := UTF8ToWinCP('計算結果' + sLineBreak + FormatFloat(',0.000', LValue));
LCap := UTF8ToWinCP('情報');
MessageBox(Handle, PChar(LText), PChar(LCap), MB_ICONINFORMATION);
end;
end.
|