现在的位置: 首页 > 综合 > 正文

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

2013年08月04日 ⁄ 综合 ⁄ 共 1521字 ⁄ 字号 评论关闭

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

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

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.

抱歉!评论已关闭.