dll多次调用后释放问题(200分)

  • 主题发起人 主题发起人 ssjyr
  • 开始时间 开始时间
S

ssjyr

Unregistered / Unconfirmed
GUEST, unregistred user!
如果一个Dll被动态调用两次,两次得到的地址(标识)都不同,可以吗?
代码如下:
DllHandle := LoadLibrary('Project2.dll');
ProcAddr := GetProcAddress(DllHandle, PChar('LoadDLL'));
if assigned(ProcAddr) then
begin
DllShow := ProcAddr;
DllShow(Handle, wm_user);
end;
 
当然可以了。
 
同一应用程序调用两次Dll,得到两个不同的地址,怎样搞啊?不要光说可以啊,怎么写呢
 
每次LoadLibrary回映射dll物理内存位置到进程的虚拟空间,两次不一样是正常的.
 
应该不会进行两次映射吧! 应该是引用次数来决定. 我认为不会得到两个
不同的地址,在同一进程里面.
 
to kk2000:当然有可能,两次loadlibrary中间又申请了很多内存不释放,dll
只好被映射到别的地方去了。
 
TO xeen 其实loadlibrary 跟启动EXE文件的在内存管理原理是一样的, 只是一个
内存映射文件而已, 如果你装载了之后,OS知道的,只是增加一次引用次数了! 如果不是同
一进程的话,也是增加引用次数,只不过是在别进程的地址空间可能映射的地址就不同了. 我相信同一进程内是一样的. 除非你释放dll,从新装载可能就不同.
 
恩,我同意你的意见,不释放dll地址都是一样的.
 
补充一点
FreeLibrary(LibModule:hmodule)函数减小LibModule指定的库的实例计数,当该dll的实例计数是零时调用的dll就会被释放。所以每次loadLibrary后都应该freeLibrary
if assigned(ProcAddr) then
begin
@DllShow := ProcAddr
//这句代码是不是应该这么写
DllShow(Handle, wm_user);
end;
 
不知大家有没有写过Dll方面的三层程序,因为我就试过有问题,如果Dll窗体中再加入一个DataModule,而DataModule引用服务器端,这样如果主程序连续调用两次动态调用Dll,释放时就会有问题.不知大家碰到过这类问题没有 ?
希望大家帮忙探讨一下吧
 
后退
顶部