如何在动态库中打开窗口

gflpower 2003-10-15 05:07:02
如何在动态库中打开窗口
...全文
49 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
pankun 2003-10-15
  • 打赏
  • 举报
回复
转自猛料


作为一个经常被提起的问题,很多人不知道怎么来从DLL中导出窗体,特别是MDI的子窗体,因此Kingron愿意在这里把一些经验写出来给大家分享,让大家在碰到类似的问题的时候,少走些弯路。

大家知道,DLL有两种加载方式,至于动态的,和静态的,稍微有点儿区别。动态的加载,大家可以参考Torry's Delphi Page上面的例子,其中有一个MDI的例子,非常简单的,很好用。我的例子以静态加载为主。

据目前来看,我们要在DLL中导出这个Form的话,必须通过DLL导出函数来做到,但是我们知道DLL工程的Application和Host程序的Application是有区别的,对于一般的应用程序来说,Application是VCL固定的,一般不会修改Application对象指针,但是在DLL中,我们需要使用窗体等,或者使用Application对象的时候,使DLL的Application和Host程序一样,这样才不至于混淆。以下面的例子为例,如果不修改Application对象,那么Host程序退出的时候,可能出现AV错误!例如:

在Host中Export一个函数:

function DllFunction(App:TApplication;PForm:TForm):TForm2;stdcall;

begin

Result :=TForm2.Create(PForm);

end;

那么主程序推出的时候,很可能发生AV错误。

下面一步一步来做:

首先,我们需要一个DLL工程,在IDE中New一个DLL,然后New一个Form,Save All File,工程名为DLL.DPR,Form的Unit文件为DLLForm.pas,窗体类名为FrmDLLChild。然后随便设计这个DLLChild Form即可。

然后,在DLL.DPR中修改代码,添加:

library Dll;

uses

SysUtils,windows,

Classes,Controls,Forms,

DllForm in 'DllForm.pas' ;

{$R *.res}

var

DllApp:TApplication;

{ 用于初始化:保存DLL本身的Application,然后设置DLL的Application指向Host的Application }

procedure InitDLL(App:TApplication);stdcall;

begin

DllApp:=Application;

Application:=App;

end;

{ 善后工作:恢复DLL原来的Application }

procedure FreeDLL;stdcall;

begin

Application:=DllApp;

end;

{ 返回一个窗体对象,这是DLL的主要功能 }

function GetDllChildForm(Parent:TComponent):TFrmDLLChild;stdcall;

begin

Result := TFrmDLLChild.Create(Parent);

end;

exports

InitDLL,FreeDLL,GetDllChildForm;

begin

end.

至此DLL已经完成了,在使用DLL的时候,需要注意:首先必须调用InitDLL,并且传递主程序的Application作为参数,否则主程序退出的时候,会报AV错误。

主程序调用如下:

为了简单方便地使用,可以把DLL中包含窗体的那个单元Use进来,如果不喜欢,用类型强制也可。

function GetDllChildForm(Parent:TComponent):TFrmDllChild;stdcall;external 'dll.dll';

procedure InitDLL(App:TApplication);stdcall;external 'dll.dll';

procedure FreeDLL;stdcall;external 'dll.dll';

procedure TForm1.FormCreate(Sender: TObject);

begin

InitDLL(Application);

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin

FreeDLL;

end;

调用窗体代码:

var

DForm:TFrmDllChild;

begin

DForm :=DllFunction(Application,Self);

DForm.Show;

end;

附件中的代码完整演示了一个简单的例子。 DllProject.rar

至于动态加载的演示,请参看《MDI Child Form和DLL》

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧