您的位置:首页 > 其它

静态/动态调用dll封装窗体(模态/非模态)

2013-03-14 08:47 441 查看
看到有网友需要这样的例子,所以写了一个.

有不对或不合理的地方请跟帖指导.

delph XE下测试通过.

Dll项目文件

library Project10;

uses
SysUtils,
Classes,
Forms,
Unit14 in 'Unit14.pas' {Form1};

{$R *.res}

Function EDebtMoney(H: THandle): integer;
begin
Application.Handle := H;
with TForm1.Create(Application) do
try
ShowModal;
Result := 0;
finally
Free; { 调用结束时销毁窗口 }
end;
end;

Function GetForm(H: THandle): THandle;
begin
Application.Handle := H;
with TForm1.Create(Application) do
try
Show;
Result := Handle;
except on e : Exception do
raise e.Create(e.Message);
end;
end;

exports EDebtMoney, GetForm;
begin

end.


dll中窗体关闭事件

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;


调用单元

unit Unit13;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm13 = class(TForm)
btn1: TButton;
btn2: TButton;
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form13: TForm13;
function MyForm(H: THandle) : THandle; stdcall;
implementation

function MyForm; external 'Project10.dll' name 'GetForm';
{$R *.dfm}

//动态调用  模态窗口
procedure TForm13.btn1Click(Sender: TObject);
type
TGetForm = function (H: THandle) : Integer; cdecl;
var
DllForm : TGetForm;
DllHandle : THandle;
nn : integer;
begin
DllHandle := LoadLibrary(PChar('Project10.dll'));

try
if DllHandle <> 0 then
begin
DllForm := GetProcAddress(DllHandle, 'EDebtMoney');
nn := DllForm(Application.Handle) ;
self.Caption  := inttostr(nn);
end;
finally
FreeLibrary(DllHandle);
end;

end;
//静态调用  非模态窗口
procedure TForm13.btn2Click(Sender: TObject);
var
DllHandle : THandle;
begin
DllHandle := MyForm(Application.Handle);
end;

end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: