ただし、フォームの 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 件のコメント:
コメントを投稿