2011年4月9日土曜日

【Delphi】フォームを使用する DLL の終了処理

DLL でも通常のアプリケーションと同様に Form を表示することができる。
ただし、フォームの Owner となるコンポーネントが渡せないので、自分で Free してやる必要がある。
DLL の解放時に終了処理を行なうには以下のようにする。


// DLL のメインプログラム

library DllTest

uses
・・・,

Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
var
  savDllProc: procedure(Reason: Integer);

procedure LibExit(Reason: Integer);
begin
  //クラス手続き FreeMe はフォームが Create されていれば解放する。
  if (Reason = DLL_PROCESS_DETACH) then
    TForm1.FreeMe(nil);
  // 保存された終了手続きがあれば呼び出す
  if Assigned(savDllProc) then
    savDllProc(Reason);  
end;

procedure ShowMyForm: stdcall;
begin
  //TForm1 のクラス手続き Execute はフォームを表示する。
  TForm1.Execute(nil);
end;

exports
  ShowMyForm;

begin
  savDllProc := DllProc; // 終了手続きを保存
  DllProc := @LibExit;  // LibExit を終了手続きとして設定
end.

*上記で呼び出す Form のメソッドは以下のようなものを想定 :

class procedure TForm1.Execute(Sender: TObject);
begin
  if (Form1 = nil) then begin
    Form1:=TForm1.Create(nil);
  end;
  with Form1 do begin
    ShowModal;
  end;
end;

class procedure TForm1.FreeMe(Sender: TObject);
begin
  if (Form1 <> nil) then begin
    Form1.Free;
    Form1 := nil;
  end;
end;

0 件のコメント: