高难度问题,dll怎么卸载?
在调用gethostname的时候,如下dll被加载了:
Loaded 'C:\WINNT\system32\rnr20.dll', no matching symbolic information found.
Loaded 'C:\WINNT\system32\iphlpapi.dll', no matching symbolic information found.
Loaded 'C:\WINNT\system32\icmp.dll', no matching symbolic information found.
Loaded 'C:\WINNT\system32\mprapi.dll', no matching symbolic information found.
Loaded 'C:\WINNT\system32\activeds.dll', no matching symbolic information found.
Loaded 'C:\WINNT\system32\adsldpc.dll', no matching symbolic information found.
Loaded 'C:\WINNT\system32\rtutils.dll', no matching symbolic information found.
Loaded 'C:\WINNT\system32\setupapi.dll', no matching symbolic information found.
Loaded 'C:\WINNT\system32\userenv.dll', no matching symbolic information found.
Loaded 'C:\WINNT\system32\rasapi32.dll', no matching symbolic information found.
Loaded 'C:\WINNT\system32\rasman.dll', no matching symbolic information found.
Loaded 'C:\WINNT\system32\tapi32.dll', no matching symbolic information found.
Loaded 'C:\WINNT\system32\dhcpcsvc.dll', no matching symbolic information found.
Loaded 'C:\WINNT\system32\winrnr.dll', no matching symbolic information found.
Loaded 'C:\WINNT\system32\rasadhlp.dll', no matching symbolic information found.
Loaded 'C:\WINNT\system32\msafd.dll', no matching symbolic information found.
Loaded 'C:\WINNT\system32\wshtcpip.dll', no matching symbolic information found.
而gethostname在整个程序运行中我只需要调用一次.我不希望这些dll常驻内存,ws2_32.dll我动态加载的.调用gethostname后我释放了这个dll.但是如上的dll却没有跟着释放掉.这是什么意思?dll不是有应用计数吗?还有谁在用这些没有释放的dll?有没有办法释放掉这些dll?高手们请发表一下意见.
问题点数:100、回复次数:17Top
1 楼Lightest(一闪而过)回复于 2003-06-01 15:01:12 得分 0
用了就让你甩不掉Top
2 楼shuker(我是一只小花猪)回复于 2003-06-01 16:08:20 得分 0
如果你是静态链接的那就没法释放
如果你一定要释放那就只能用loadlibrary和freelibrary来做的
不知道高手还有没有别的更好的方法Top
3 楼wxfjb(鲸宝宝)回复于 2003-06-01 16:44:57 得分 5
静态的好像不行啊Top
4 楼awnucel(西大耻犹未雪,南京恨何时灭&抵制日货)回复于 2003-06-01 17:20:45 得分 5
upTop
5 楼ATField()回复于 2003-06-01 18:42:38 得分 10
我认为
Loaded ...DLL
只是代表系统把这些DLL映射到你的程序的虚拟地址空间中了
并不一定代表这些DLL是当你的程序运行的时候才被加载
其实这些DLL你的系统一直都要用的,你不是在上网吗?
Top
6 楼Lightest(一闪而过)回复于 2003-06-02 00:18:43 得分 0
如果我不调用gethostname,这些dll都是不会加载的.gethostname是通过动态加载dll,调用getprocaddress得到的函数地址调用的.但是当释放dll时.上述列表中的dll却没有跟着释放.不动手做做试验想当然的,就别回答这个问题了.Top
7 楼ATField()回复于 2003-06-02 11:43:18 得分 0
The LoadLibrary function maps the specified executable module into the address space of the calling process.
是map而不是load
Top
8 楼ATField()回复于 2003-06-02 12:32:45 得分 10
对了,你是怎么知道没有卸载的
VC应该不会在Output中显示出来吧Top
9 楼jyxy_ljw()回复于 2003-06-02 15:32:30 得分 10
upTop
10 楼Lightest(一闪而过)回复于 2003-06-02 21:30:46 得分 0
就没有人动手做测试吗?dll有没有卸载看exe占用的内存就知道.当你调用gethostname后内存占用会猛增1MB.Top
11 楼guid8519(guid8519)回复于 2003-06-02 21:38:47 得分 10
可以使用LoadLibrary和GetProcAddress来获取gethostname函数的地址
调用完毕后,把动态库FreeLibrary掉.
gethostname在winsock32.dll(系统目录下)中Top
12 楼Lightest(一闪而过)回复于 2003-06-03 11:59:27 得分 0
guid8519(guid8519) 你没有测试吧?Top
13 楼windleee(风子)回复于 2003-06-03 21:53:31 得分 10
系统启动的时候会自动调用WSOCK32。DLL,要不你的网络怎么启动,
如果DLL没有加载,调用的时候会加载,否则是映射DLL的使用纪录加1,
卸载是使用纪录-1,当使用纪录为0是,DLL从内存卸载
好像是这样的说...
Top
14 楼Lightest(一闪而过)回复于 2003-06-08 12:37:06 得分 0
windleee,不错,书上是这么说的,不过我敢肯定你没有这么去测试过.失望中....Top
15 楼rivershan(阿门)回复于 2003-06-08 13:21:47 得分 35
我的机器上VC6,调用gethostname后,
Loaded exports for 'ntdll.dll'
Loaded exports for 'C:\WINDOWS\system32\kernel32.dll'
Loaded exports for 'C:\WINDOWS\system32\ws2_32.dll'
Loaded 'C:\WINDOWS\system32\msvcrt.dll', no matching symbolic information found.
Loaded exports for 'C:\WINDOWS\system32\ws2help.dll'
Loaded exports for 'C:\WINDOWS\system32\advapi32.dll'
Loaded exports for 'C:\WINDOWS\system32\rpcrt4.dll'
Loaded exports for 'C:\WINDOWS\system32\user32.dll'
Loaded exports for 'C:\WINDOWS\system32\gdi32.dll'
Loaded exports for 'C:\WINDOWS\system32\imm32.dll'
Loaded exports for 'C:\WINDOWS\system32\lpk.dll'
Loaded exports for 'C:\WINDOWS\system32\usp10.dll'
Loaded exports for 'C:\WINDOWS\system32\msctf.dll'
Loaded exports for 'C:\Program Files\Kingsoft\Powerword 2003\Cjktl32.dll'
Loaded exports for 'C:\WINDOWS\system32\version.dll'
Loaded exports for 'C:\WINDOWS\system32\msctfime.ime'
Loaded exports for 'C:\WINDOWS\system32\ole32.dll'
Loaded exports for 'C:\WINDOWS\system32\msimtf.dll'
-----------------------------
用Dependens看这个程序,
TEST.EXE
WS2_32.DLL
MSVCRT.DLL
KERNEL32.DLL
NTDLL.DLL
WS2HELP.DLL
NTDLL.DLL
ADVAPI32.DLL
KERNEL32.DLL
ADVAPI32.DLL
NTDLL.DLL
KERNEL32.DLL
RPCRT4.DLL
ADVAPI32.DLL
NTDLL.DLL
KERNEL32.DLL
KERNEL32.DLL
USER32.DLL
NTDLL.DLL
KERNEL32.DLL
GDI32.DLL
NTDLL.DLL
KERNEL32.DLL
USER32.DLL
ADVAPI32.DLL
KERNEL32.DLL
NTDLL.DLL
Top
16 楼rivershan(阿门)回复于 2003-06-08 13:23:21 得分 0
前面的是VC调试用的,后面才是程序真正调用的
Top
17 楼zleeway(杂草)回复于 2003-06-08 14:05:51 得分 5
DLL调用后不会立刻卸装,因为window把它放在缓冲池,当前别的程序使用同一DLL时,可以加快程序的速度.
如果要改变这一行为,可以修改注册表
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer]
"AlwaysUnloadDll"="1"Top




