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

看到有网友需要这样的例子,所以写了一个.  

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

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.


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值