Dll中创建MDI窗体,使用动态Load,在子窗体关闭后要将对应的Dll Free掉,可出错!在线等!(300分)

  • 主题发起人 主题发起人 mxchao
  • 开始时间 开始时间
M

mxchao

Unregistered / Unconfirmed
GUEST, unregistred user!
&nbsp;每个子窗体对应一个Dll,通过加载不同的Dll,创建不同的窗体。<br>&nbsp; 现在DLL释放是在主窗体关闭时释放加载的所用Dll,子窗体关闭时不释放,可如果<br>加载过多则程序内存使用飞速上涨,子窗体关闭以后(使用了caFree,动态free),<br>内存不见变化,且到一定程度出现canvas 过多(实例了过多的可视控件)。<br>&nbsp; 现想在子窗体关闭时,将对应窗体的加载的Dll释放掉。 <br>&nbsp; 方法如下:在子窗体关闭时发送一个消息给主窗体,此时子窗体不自行关闭,主窗体接到<br>消息后,在消息处理喊出中,调用Dll输出的一个函数将子窗体关闭,关闭窗体完成后进行<br>Dll的释放。<br>&nbsp; 问题如下:关闭主窗体关闭子窗体没有问题,但在Free Dll时出现地址错误,跟踪时发现<br>FreeLibrary( )执行已经结束,只是在整个消息函数的结尾出现,不知道调用了什么。<br>&nbsp; 但如果采用如下方法则没有问题,在子窗体发送给主窗体的消息后,主窗体消息处理函数<br>只进行子窗体的关闭,不进行Free,使用另外一个按钮将Dll Free掉则一切正常。<br>&nbsp; 感觉还是有一部分资源释放掉之后被调用,或者时释放顺序错误。<br>&nbsp; <br>&nbsp;<br>&nbsp;
 
你自己去源码空间下<br>那儿有个dll 窗体的例子
 
楼上说的不错,有的,接分
 
&nbsp;下载一个好像,另一个不能下载!<br>&nbsp; 好像没有都没有执行free 操作!<br>&nbsp; 并且也只是创建了一个窗体!在50个Dll被调用时将怎么样?<br>&nbsp;
 
使用包的技术来实现
 
你Free完子窗体后,FreeLib前,执行一句Application.ProcessMessages;
 
你Free完子窗体后,FreeLib前,执行一句Application.ProcessMessages;
 
我替楼主答吧,不行。如果不free就不出错<br>我也在找办法
 
&nbsp;我已经被折磨的不行了,都是动态连接库惹的祸!!!
 
这个问题,我前两天刚解决了,你看看吧<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=1649856<br>记得给我分呀[:D]
 
小笨苯:<br>&nbsp; &nbsp;在Dll库中使用PostMessage我已经试过了,可还是有问题。<br>望指点!<br>能不能给我发一份Demo,多谢!mengxchao@263.net
 
mxchao:<br>我给你发过去啦,注意收一下。<br>大家互相帮助啊![:D]
 
不要打哑谜了,我给个思路吧:<br><br>其实不应该在收到DLL消息的过程中释放DLL,因为这样会引起死锁,甚至错误。<br>应该采用关闭标志数组的办法,接受到消息的时候仅仅将可对应的关闭标志设置为可关闭,<br>让另外一个过程,比如线程或Timer来进行处理。<br>如果你认为这个过程是耗费资源的,那么你可以在接受到DLL消息的时候<br>激活这个线程或Timer,而线程或Timer处理完后就自动设置为不激活状态。
 
小笨苯:<br>&nbsp; &nbsp;已经收到,多谢!<br>&nbsp; &nbsp;正在研究中。
 
DarwinZhang:<br>&nbsp; 我现在正在测试这种方法,在主窗体中创建一个TStringList列表保存DLL的指针,<br>子窗体释放时发消息给主窗体,在列表中对关闭窗体进行标记,在新的窗体创建时<br>对列表进行遍历,将已经关闭窗体的DLL进行释放。<br>&nbsp; 这种方法是可行的,可遇到一个怪问题,DLL是释放掉了,可最后释放TStingList对象<br>时出现地址错误,感觉不应该,可找了很久也没发现问题!出问题的几率和加载的Dll数量<br>有关,在那出现了内存漏洞!
 
请将相关的实现代码帖出来。谢谢!<br>其实我推荐利用数组和Timer的办法。
 
to 小笨苯:<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=1382432<br>我已经能用更好的办法了,如下:<br>unit Unit1;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br>&nbsp; Dialogs;<br><br>type<br>&nbsp; TForm1 = class(TForm)<br>&nbsp; &nbsp; procedure FormCanResize(Sender: TObject; var NewWidth,<br>&nbsp; &nbsp; &nbsp; NewHeight: Integer; var Resize: Boolean);<br>&nbsp; &nbsp; procedure FormCreate(Sender: TObject);<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; &nbsp;Ratio:Single;<br>&nbsp; &nbsp;procedure MyMouseDown(var msg:TMessage); message WM_NCHitTest;<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>&nbsp; Form1: TForm1;<br><br>implementation<br><br>{$R *.dfm}<br><br>procedure MyMouseDown(var msg:TMessage);<br>begin<br>&nbsp;inherited;<br>&nbsp;if (msg.result&gt;9)and(msg.result&lt;18) then tag:=0;<br>end;<br><br>procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,<br>&nbsp; NewHeight: Integer; var Resize: Boolean);<br>begin<br>&nbsp;if tag=0 then begin<br>&nbsp; if NewWidth&lt;&gt;Width then tag:=1;<br>&nbsp; if NewHeight&lt;&gt;Height then tag:=2;<br>&nbsp;end;<br>&nbsp;if tag=1 then NewHeight:=Round(NewWidth*Ratio);<br>&nbsp;if tag=2 then NewWidth:=Round(NewHeight/Ratio);<br>end;<br><br>procedure TForm1.FormCreate(Sender: TObject);<br>begin<br>&nbsp;Ratio:=0.8;<br>end;<br><br>end.<br><br>请您测试。<br>
 
DarwinZhang:<br>老大,你经过仔细测试了吗?我在Delphi5下编译运行后,触发异常了[:(]
 
to 小笨笨:<br>因为没有特别的地方,一般来说,只要您关联了FromCreate事件是不太可能触发异常的。<br>我在Delphi6+Win2K下面没有任何问题,<br>如果您那里确实有异常,请告诉我单部执行(F8或设置断点)到哪一步异常了。谢谢!
 
嘿嘿,不好意思啊![:)]我心急了,没关联,谢谢啦!
 
后退
顶部