300分,给第一个给出可行建议的人:DLL释放的老问题(300分)

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

monster

Unregistered / Unconfirmed
GUEST, unregistred user!
本人太笨,写的DLL,调用程序运行完毕,可能没完全释放,程序及dll都无法删除或重命名,提示:

无法删除 xxx: 访问被拒绝.

请确定磁盘未满或未被写保护
而且文件未被使用.

折腾一天了,找不着原因:( 救急啊!!!!!
 
用完DLL后,要用FreeLibrary
++++++++++++++++++++++++++
var
LibHandle: THandle;
begin
LibHandle := LoadLibrary('abc.dll');
try
if LibHandle = 0 then
raise EDLLLoadError.Create('DLL调入失败')
else
begin
//代码能执行到这里,表明DLL调入成功
end;
finally
FreeLibrary(LibHandle);//释放DLL
end;
end;
 
我采用的是静态调用.所有函数都用到,反复用,所以觉得没必要用LoadLibrary.
我想问一下大家,一般出现这种情况都是怎么回事儿?以往的贴子也有,但多不了了之.
大家给一些自己遇到这种情况的解决方案.谢谢!
 
按说程序运行完毕,加载的 dll 应当被卸下。难道你的 dll 也是三级跳加载(app -
dll - your dll)?加载操作必须对应卸下(FreeLibrary)就没错了。
 
静态调用的话,最好自己定义一个接口单元,把这个接口单元加到应用程序的uses子句。
 
三级倒是有,还不止,不过都是自己写的,app - mydll - myanotherdll - ...
 
这个就不知道了。难道你的应用程序结束以后连删除都不行?是不是程序在结束操作的
时候你试图将自己删除?
 
>程序及dll都无法删除或重命名
你的程序没有退出吧
所以dll也没有卸载
just guess
 
呵呵,我猜是:你感染病毒了,怕怕~~~~~

你的yourdll.dll被另一个程序使用了,在你的dll初始化的时候dump出使用的应用程序
名字,然后看看。同时dump出使用计数等研究研究,如果猜对了,就给点分,如果没有,
我也没折了。

还有,如果你的dll是一个COM服务器的话,就难说了。
 
哈哈哈,黄天不负有心人,找到原因了,在DLL里用到了我写的一个控件(监测网络断开用线程实现),
我把这个控件换成另一版本(监测网络断开用Timer实现),就不再有这个问题。
TNND,今天我至少重启了一百次机器,在测试目录下建了20个输出目录(输出一次就不能再调试输出了,
打一枪换一个地方),苦阿!

归根到底,是线程怎么彻底释放的问题。
大家可以看我以前发的一个贴子,继续讨论:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=569087
 
是有这个问题,如果你在动态库里创建了一个窗体,而没有释放,就会与你的情形一样!
而且资源释放一直存在问题!
 
呵呵,就是线程没释放,线程要是正常释放就没问题了。
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
439
import
I
后退
顶部