社区
Delphi
帖子详情
在MDI中用dll调用子窗体,何时释放dll更好???
yurenjf
2003-08-21 10:27:28
在我做的MDI窗体内是用dll生成子窗体的,可是怎样及时FreeLibrary呢?
小弟多次试验,屡屡失败,总是报告内存错误.
还有,当子窗体内使用TClientDataSet组件时就无法调出子窗体,(数据来自自定义的接口).
那位大侠出手相救呀!!!
...全文
62
4
打赏
收藏
在MDI中用dll调用子窗体,何时释放dll更好???
在我做的MDI窗体内是用dll生成子窗体的,可是怎样及时FreeLibrary呢? 小弟多次试验,屡屡失败,总是报告内存错误. 还有,当子窗体内使用TClientDataSet组件时就无法调出子窗体,(数据来自自定义的接口). 那位大侠出手相救呀!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
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
打赏
举报
回复
心情不好, 散分了................
blueshrimp
2003-08-21
打赏
举报
回复
释放内存的顺序
WLiu
2003-08-21
打赏
举报
回复
这种情况我看最好是不要马上将子窗口释放,这样是肯定会有错误的,最好是将当前的窗口隐藏,等主窗口关闭以后再进行释放
delphi 开发经验技巧宝典源码
0266 在
MDI
中真正关闭
子
窗体
176 0267 给
MDI
主
窗体
添加背景 176 0268 动态显示像
MDI
的
子
窗体
177 0269 打开
MDI
窗体
时其他
窗体
会显示出来的原因 177 8.4
窗体
的大小及位置 178 0270 控制
窗体
的最大化、...
【爱码农】C#制作
MDI
文本编辑器
本教程完整讲解了使用C#编程语言开发《
MDI
文本编辑器》(
MDI
记事本)程序的完整过程。本视频教程非PPT录播方式,...整个教程分成三个块面: ①单
窗体
的记事本程序设计 ②查找/替换
窗体
程序设计 ③
MDI
记事本程序
窗体
设计
delphi 开发经验技巧宝典源码06
0266 在
MDI
中真正关闭
子
窗体
176 0267 给
MDI
主
窗体
添加背景 176 0268 动态显示像
MDI
的
子
窗体
177 0269 打开
MDI
窗体
时其他
窗体
会显示出来的原因 177 8.4
窗体
的大小及位置 178 0270 控制
窗体
的最大化、...
VB编程资源大全(源码 其它3)
p011_dbprint.zip 数据库打印的例
子
(7KB) 600,p010_print.zip 一个
调用
打印机的VB程序范例(8KB) 601,p009_vbSimple35.zip 打印预览(21KB) 602,p008_prview32.zip 在VB
中用
OLE服务实现打印预览...
Delphi
5,388
社区成员
262,730
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章