library DLLSample; // library はDLLであることを示す。
uses
SysUtils,
Classes; // Unit作成時と同様に、必要ならばユニットを追加して構わない。
{$R *.res}
// ここから、DLL側が行う処理をUnit作成時と同様に記述。
// 返し値を持たない処理は procedure
// 返し値を持つ処理は function
// 固定値は受け渡せないので、DLL側で管理する固定値は function で返す。
function Version: ShortString; stdcall;
// 最後に stdcall を追加すると、Delphi以外の言語でも返し値が使えるようになる。
// ただしDelphi以外の言語で返し値を使いたい場合は、返し値の型にも注意すること。
// 例えば String はDelphi独自の型なので、PChar か ShortString を使うようにする。
begin
Result := DateToStr( FileDateToDateTime(FileAge('DLLSample.dll')) );
// この場合、返し値は'DLLSample.dll'と言うファイルのタイムスタンプ。
end;
exports
Version; // 外部ファイルから呼び出せる処理を記述。
// ここに記述されない処理は、DLL内部専用処理になる。
begin
end.
unit Unit_Sample;
:
:
{$R *.dfm}
// ここから、DLLを呼び出すための記述。
function ver: ShortString; stdcall;
// 処理名や引数名は異なっても構わないが、
// 引数や返し値の型と「stdcall」の有無は、DLL側と同じにすること。
external 'DLLsample.dll' name 'Version';
// external で呼び出すDLLを指定する。
// name は、DLL内部での処理名が、ここに記述した処理名と異なることを示す。
// DLL内部での処理名と、ここに記述した処理名が同じなら不要。
// また、DLL内部の処理名は常に大文字と小文字が区別されるので、
// 大文字・小文字は常に正確に記述すること。
// ここまで、DLLを呼び出すための記述。
procedure TForm1.FormCreate(Sender: TObject);
begin
self.Caption := ver;
end;
end.
library DLLSample;
uses
Windows, // 呼び出し元の特定に使用。
Forms, // フォームの操作に使用。
Controls, // 返し値 TModalResult の操作に使用。
Unit_DLLForm in 'Unit_DLLForm.pas' {DLLForm}; // フォームのソースファイル。
{$R *.res}
function ShowDLLForm(hOwner: HWND): TModalResult; stdcall;
begin
Application.Handle := hOwner; // 呼び出し元の情報をDLL側が受け取る。
DllForm := TDllForm.Create(Application); // DLL側でフォームを作成する。
// フォームに配置された各オブジェクトも、自動で作成される。
Result := DllForm.ShowModal; // 返し値を設定。
DllForm.Free; // DLL側で作成したフォームを破棄。
Application.Handle := 0; // 呼び出し元の情報を破棄。
end;
procedure ShowDLLForm2;
begin
DllForm := TDllForm.Create(Application); // DLL側でフォームを作成する。
DllForm.Show; // 作成したフォームを表示。
end;
exports
ShowDLLForm,
ShowDLLForm2;
begin
end.
unit Unit_Sample;
:
:
implementation
{$R *.dfm}
// ここから、DLLを呼び出すための記述。
function ShowDLLForm(hOwner: HWND): TModalResult; stdcall;
external 'DLLSample.dll';
procedure ShowDLLForm2;
external 'DLLSample.dll';
// ここまで、DLLを呼び出すための記述。
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowDLLForm(Application.Handle);
// DLL側でフォームを作成した後、
// 通常のフォームのShowModalメソッドと同じ動作をして
// 作成したフォームを破棄。
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ShowDLLForm2;
// DLL側でフォームを作成した後、
// 作成したフォームを表示。
end;
end.
DLL内フォームの表示/非表示を、実行ファイルのToolButtonで制御するプログラムのソース。頑張れば他の制御にも応用できるかも。
基本的な仕組みは、
library DLLSample;
uses
Windows, // 呼び出し元の特定に使用。
Forms, // フォームの操作に使用。
ComCtrls, // ToolButtonの特定に使用。
Unit_DLLForm in 'Unit_DLLForm.pas' {DLLForm}; // DLLフォームのソースファイル。
{$R *.res}
procedure CreateDLLForm(hOwner: HWND); stdcall; // DLLフォームを作成する。
begin
Application.Handle := hOwner; // DLLフォームの親アプリケーションを特定。
DllForm := TDllForm.Create(Application); // DLLフォームを作成。
end;
procedure FreeDLLForm; stdcall; // DLLフォームを破棄する。
begin
DLLForm.Free; // DLLフォームを破棄。
Application.Handle := 0; // DLLフォームの親アプリケーションを解放。
end;
procedure SetToolBtn1(Sender: TToolButton);
begin // 親アプリのToolButtonとDLLフォームを連携させる。
DLLForm.ToolBtn1 := Sender; // 親アプリのToolButton名をDLLフォーム側に保存。
with Sender do // 親アプリ側のToolButton設定を変更する。
begin
Style := tbsCheck; // ToolButtonをトグルスイッチ型に設定。
// ↑動作確認用。ToolButtonのプロパティを直接設定して構わない。
OnClick := DLLForm.ToolBtn1Click;
// ToolButtonをクリックしたときの処理をDLLフォームで用意したものに変更。
end;
end;
exports // 親アプリから呼び出せる処理を設定。
CreateDLLForm,
FreeDLLForm,
SetToolBtn1;
begin
end.
unit Unit_DLLForm;
:
:
type
TDLLForm = class(TForm)
:
:
public
ToolBtn1: TToolButton; // 親アプリのToolButtonを保存するための変数。
procedure ToolBtn1Click(Sender: TObject);
// 親アプリのToolButtonをクリックしたときの処理の定義。
:
:
implementation
{$R *.dfm}
procedure TDLLForm.ToolBtn1Click(Sender: TObject);
begin // 親アプリのToolButtonがクリックされたとき、
DLLForm.Visible := TToolButton(Sender).Down;
end; // DLLフォームの表示/非表示は ToolButton.Downプロパティに合わせる。
procedure TDLLForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin // DLLフォームが閉じられるとき、
ToolBtn1.Down := False;
end; // 親アプリのToolButtonのトグルをオフ側にする。
:
:
unit Unit_Sample;
:
:
implementation
{$R *.dfm}
// ここから、DLLを呼び出すための記述。
procedure CreateDLLForm(hOwner: HWND); stdcall;
external 'DLLSample.dll'; //
procedure FreeDLLForm; stdcall;
external 'DLLSample.dll';
procedure SetToolBtn1(Sender: TToolButton);
external 'DLLSample.dll';
// ここまで、DLLを呼び出すための記述。
procedure TForm1.FormCreate(Sender: TObject);
begin
CreateDLLForm(Application.Handle); // DLLフォームを初期化。
SetToolBtn1(ToolButton1); // ToolButton設定を初期化。
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeDLLForm; // DLLフォームを破棄。
end;
:
: