社区
Delphi
帖子详情
大侠:请问 调用DLL生成的MDI子窗体,想关闭怎么办???
yurenjf
2003-08-22 08:41:19
调用DLL生成的MDI子窗体,怎么关闭呀? 又不能隐藏,但是关闭后如果再调出就会出错
有什么高招,帮帮小弟,拜托
...全文
54
7
打赏
收藏
大侠:请问 调用DLL生成的MDI子窗体,想关闭怎么办???
调用DLL生成的MDI子窗体,怎么关闭呀? 又不能隐藏,但是关闭后如果再调出就会出错 有什么高招,帮帮小弟,拜托
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
FrameSniper
2003-09-15
打赏
举报
回复
你的是动态创建的吗?如果是动态创建的,怎么可能关闭后在调用又出错呢?
而且是否指定了子窗体的Owner对象?
AWolfBoy
2003-09-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;
yurenjf
2003-09-15
打赏
举报
回复
心情不好, 散分了................
movingboy2
2003-08-22
打赏
举报
回复
最好贴出你创建该窗体的代码来,大家才好帮你分析。
永远专注NET
2003-08-22
打赏
举报
回复
不用那么费事。只要
在onclose事件里写下:
action:=cafree;
form1:=nil;
MMisLady
2003-08-22
打赏
举报
回复
调用时如下,没问题
try
if fmMDI=nil then fmMDI:=TfmMDI.Create(Application);
fmMDI.ShowModal ;
finally
Application.Handle:=0;
fmMDI.Free;
fmMDI:=nil;
end;
deeply
2003-08-22
打赏
举报
回复
在OnClose中写
Action:=CaFree;
Self := nil;
主题:程序的扩展性(BPL+
DLL
)
主题:程序的扩展性(BPL+
DLL
) 主题:程序的扩展性(BPL+
DLL
)时间:星期一下午(2004-11-22 15:00)主持:A1 / A3 关联A3的Demo: http://www.hnyyzy.com/myweb/dksoft/
DLL
_BPL.rar 2004-11-22 15:06:45 A1.Aleyn.wu(45198124)今天的主题:利用BPL+
DLL
扩展程序...
CSDN回帖得分大全(近两年)
√vs2005
调用
dll
的时候Initialize()函数返回错误 [VC/MFC 基础类] 40 ylongwu 05-21 20:486 ylongwu06-28 13:42管理√为什么我创建登陆框之后,然后获取登陆框的数据时候总是出现非法操作! [VC/MFC 界面] 40 chencheng8095 05-23 00:2911 xianglitian06-10 11:51管理√CFileFind::FindFile 支持通配符么? [VC/MFC 基础类] 100 wysbk002 05-22
UI和其他
小问题,关于树控件,选中的问题?就是怎么得到当前选中项怎样在标题栏上添加自己的button或其他控件
请问
显示桌面按钮触发的Windows消息是什么?哪位有像Windows2000任务管理器中性能的那个曲线图的源代码。控件中如何使用双缓存?怎么把ShockWaveFlash控件上发生的鼠标右键捕获,并替换成鼠标左键事件?用C++AndAPI写对话框程序
请问
:如何使
MDI
程序一次只打开一种文档?有没有
主题:程序的扩展性(第二节:如何扩展), 时间:2004-12-10 03:00 PM
图一 图二 图三 主题:程序的扩展性(第二节:如何扩展) 时间:2004-12-10 03:00 PM 2004-12-10 15:00:03 A1.Aleyn.wu(45198124) 先提问,写过
DLL
的有几个。 2004-12-10 15:00:21 A1.Aleyn.wu(45198124) 写过COM...
vb/vb.net开发技巧荟萃(九)
VBA如何获取控件句柄? 各位
大侠
看看我这程序 求解 小白向各位请教下VB过滤广告的问题 关于回调函数的问题 新手请教ocx文件创建的问题 如何用vb自动填写、选择下拉框选项并提交网页表单?? 如何恢复最大化 如何写外接程序启动路径? 标尺控件 各位
大侠
帮忙啊,纠结好几天了 如何规定TEXT里面只能输入数字? 悲剧的时钟 各位
大侠
帮帮忙 这样...
Delphi
5,388
社区成员
262,730
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章