动态加载dll释放的问题(我查了以前的问题,但好像没有适当的解释)(100分)

  • 主题发起人 主题发起人 pengle
  • 开始时间 开始时间
P

pengle

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序中动态加载了dll,(参数不是标准的类型,是自己定义的两个类,有点类似插件的形式,实现相应的功能,有对数据库的操作) <br><br>现在有这样的问题:如果程序运行,没有调用dll中的函数,卸载不会出什么问题(freelibrary). <br>如果调用其中的函数,则freelibrary(程序最终退出时出现cpu窗口。说什么存取异常。屏蔽掉freelibrary就不会有这个问题) <br>大富翁上说可能是资源释放的问题,但dll中只是简单的数据库操作,没有创建什么东西。dll返回时用到的数据集也都close了。(dll在专门的线程中调用) <br>程序运行没有什么问题,就是在最后退出时候异常。我查了很久。 <br>谁能帮帮我?<br>
 
有没有使用窗体?估计还是资源释放的问题。
 
没有使用窗体。使用的是数据库操作的几个控件,(datebase,query等,他们的实<br>例作为参数传递给了dll),做了相关的数据库操作。<br>我后来又试了一下,不操作数据库的话好像就没有异常了,但内存泄漏。我用bound checker<br>查的。<br>
 
我都快急死了。总不能明知内存泄漏而置之不理吧。<br>另外,有没有有效的方法检查一个句柄的有效性?比如一个socket句<br>柄(assigned只能检测是否非空。)我常遇到这样的问题:明明clientsocket<br>的connected:=true,但sendbuff老报异常。说存取错误。<br>各位老大,帮帮忙。
 
您提到“dll返回时用到的数据集也都close了。”,但是可能没有将数据集Free掉,<br>看看是不是这方面的错。
 
你可以隐式调用吗,很方便的,而且不会出错,我以前也是用显式调用,很麻烦,且容易出错,用隐式就不会了,<br>你试一下,不会的话,我教你!
 
lqh719:谢谢你的回答。但是,数据集是在主程序中创建的。<br>作为一种“资源”由dll中的服务调用。是共享的。被不同的dll<br>中的服务函数共享调用。不能free.我的程序是个服务器,被不同的<br>客户端访问(修改,存取数据等),服务器提供的数据集作为共享通道<br>可以被任何一个服务共享。<br>chensoft:隐式调用好像不可行吧。在dll中,我需要根据不同的服务名<br>(作为参数传入dll)决定调用dll种不同的服务函数。如果你的方法可行的<br>话,希望你能教教我。<br>
 
把loadlibrary和freelibrary所在的整个过程写出来看看?<br>可能会和某个本地变量有关
 
在主程序FormCreate中:<br>DllNode := TDllNode.Create();<br>DllNode.DllName := GetKey(tvServices.Items.Item[idx].Text);//取dll名字<br>DllNode.LoadLib;<br>DllPackets.AddObject(DllNode.DllName,DllNode); // DllLists.AddObject;DllPacket :TStringList<br>&nbsp; <br>procedure TDllNode.LoadLib;<br>begin<br>&nbsp; &nbsp; DllHandle := LoadLibrary(PChar('./Srv_bin/'+DllName));<br>end;<br>procedure TDllNode.FreeLib;<br>begin<br>&nbsp; &nbsp; if DllHandle&lt;&gt;0 then<br>&nbsp; &nbsp; FreeLibrary(DllHandle);<br>end;<br><br>在程序FormDestroy<br>for i:=0 to &nbsp;DllPackets.Count-1 do<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; DllNode:=TDllNode(DllPackets.Objects);<br>&nbsp; &nbsp; &nbsp; &nbsp; DllNode.FreeLib;<br>&nbsp; &nbsp; &nbsp; &nbsp; if Assigned(DllNode) then DllNode.Free;<br>&nbsp; &nbsp; end;<br>&nbsp; &nbsp; if Assigned(DllPackets) &nbsp;then DllPackets.Free;
 
to pengle<br>下面我我成功动态调用的基本框架<br>procedure TDllNode.Freeload;<br>begin<br>&nbsp; &nbsp;DllHandle := LoadLibrary(PChar('./Srv_bin/'+DllName));<br>&nbsp; &nbsp;if DllHandle&gt;0 then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp;GetProcessAddress(DllHanlde,PChar(函数名);<br>&nbsp; &nbsp; &nbsp;处理代码;<br>&nbsp; &nbsp; &nbsp;Library(DllHandle);<br>&nbsp; &nbsp;end;<br>end;<br><br>
 
duducat:<br>&nbsp; 谢谢你的回答。我知道这样做应该是没有问题的。但关键是我在dll中有对数据库<br>的操作。操作的数据集对象是作为参数在dll创建时传入的。我想90%的可能性在于数<br>据集方面。不知道大家有没有类似的经验,我用调试工具,好像sql32.dll被卸载了两<br>遍(估计的)。因为除了要卸载我自己的dll外,还要载程序退出是free掉数据集。释<br>放的先后顺序我都试过了。不行。<br><br>还有,就是,如果在dll中没有涉及到数据库,推出是没有问题的。
 
后退
顶部