分享

调出DLL中的窗体一

 delphi_笔记 2018-08-09

先设计两个窗体:DllForm(当非模式窗体)、DllModalForm(当模式窗体)

调出DLL中的窗体 - 朝三暮四 - 朝三暮四的博客

 

调出DLL中的窗体 - 朝三暮四 - 朝三暮四的博客

制作一个Dll文件:

library FormDll;

 

uses

  SysUtils,

  Classes,

  Forms,

  Windows,

  Controls,

  DllForm in 'DllForm.pas' {Form1}, //当非模式窗口

  DllModalForm in 'DllModalForm.pas' {Form2}; //当模式窗口

 

{$R *.res}

var DllApp:TApplication;

DllScreen:TScreen;

//非模式窗口

procedure ShowDllForm(aHandle:THandle;aCaption:Pchar);stdcall;

var aForm:TForm1;

begin

  Application.Handle:=aHandle;

  aForm:=TForm1.Create(Application);

  aForm.Edit1.Text:=aCaption;

  aForm.Show;

end;

//模式窗口

//procedure ShowDllModalForm(aApp:TApplication;aCaption:PChar);stdcall;

//参数传递的是Application.Handle句柄;而不是Application对象

procedure ShowDllModalForm(aHandle:THandle;aCaption:PChar);stdcall;

var aForm:TForm2;

begin

  Application.Handle:=aHandle;

  aForm:=TForm2.Create(Application);

  try

    aForm.Edit1.Text:=aCaption;

    aForm.ShowModal;

  finally

    SysUtils.FreeAndNil(aForm);

  end;

end;

procedure DllUnLoadProc(dwReason:DWord);

begin

  if dwReason=Dll_Process_Detach then

     begin

       Application:=DllApp; //恢复

       Screen:=DllScreen;

     end;

end;

Exports ShowDllForm,ShowDllModalForm; //区分大小写

begin

//Dll初始化区

DllApp:=Application;

DllScreen:=Screen;

DllProc:=@DllUnLoadProc; //Dll的善后处理工作

DllUnLoadProc(Dll_Process_Detach);

end.

在EXE文件中调用:

非模式窗体的调用:

{$R *.dfm}

var DllHandle:THandle;

procedure TForm8.Button1Click(Sender: TObject);

type

  TShowDllForm=procedure(aHandle:THandle;aCaption:Pchar);stdcall;

var

  DllForm:TShowDllForm;

begin

@DllForm:=Windows.GetProcAddress(DllHandle,'ShowDllForm');

if @DllForm<>nil then

     DllForm(Self.Handle,PChar(Edit1.Text));

end;

 

procedure TForm8.FormCreate(Sender: TObject);

begin

DllHandle:=Windows.LoadLibrary('f:\temp\FormDll.dll');

if DllHandle<32 then

   begin

     Application.MessageBox(PChar('Unable to Load Dll.'),'警告',0);

   end;

end;

 

procedure TForm8.FormDestroy(Sender: TObject);

begin

Windows.FreeLibrary(DllHandle);

end;

 

模式窗体的调用:

procedure TForm8.Button2Click(Sender: TObject);

type

  TDllModalForm=procedure(aHandle:THandle;aCaption:PChar);stdcall;

var

  DllModalForm:TDllModalForm;

  h:THandle;

begin

h:=Windows.LoadLibrary('f:\temp\FormDll.dll');

try

  if h>32 then

     begin

       @DllModalForm:=Windows.GetProcAddress(h,'ShowDllModalForm');

       if @DllModalForm<>nil then

          DllModalForm(Application.Handle,PChar(Edit1.Text));

     end;

finally

  Windows.FreeLibrary(h);

end;

end;

调出DLL中的窗体 - 朝三暮四 - 朝三暮四的博客

 

调出DLL中的窗体 - 朝三暮四 - 朝三暮四的博客

总结:关键是将EXE的系统句柄传递给DLL文件中的窗体文件,让DLL中的Application对象与EXE中的Application对象能够协调一致。  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多