FreeLibrary出错问题(100)

  • 主题发起人 主题发起人 NRID
  • 开始时间 开始时间
N

NRID

Unregistered / Unconfirmed
GUEST, unregistred user!
我用的是Delphi2007dllHandle := LoadLibrary('project1.dll');try......finallyFreeLibrary(dllHandle); //这里出错,注释掉就没错end;我在工程里用ReportMemoryLeaksOnShutdown := True;检测内存泄露,注释掉FreeLibrary那行也不会提示有内存泄漏。我想问下不写FreeLibrary会有什么问题没
 
dllHandle := LoadLibrary('project1.dll');try......finallyFreeLibrary(dllHandle); end;这样写肯定是没有错的,错的是你里面的代码 ,例如:调用DLL部分procedure TMainForm.StartClick(Sender: TObject);var ProcAddr: FarProc; ProvaChild: T_ProvaChild;begin DllHandle := LoadLibrary('ProjectDll'); try if DllHandle=0 then raise Exception.Create('未发现ProjectDll.dll加载失败!!') else begin ProcAddr := GetProcAddress(DllHandle, 'ProvaChild'); if ProcAddr <> nil then begin ProvaChild := ProcAddr; ProvaChild(Application,Self); end; end; finally //FreeLibrary(DllHandle); 如果不注释掉也会报错的 end;end;DLL部分 function ProvaChild(ParentApplication: TApplication; ParentForm: TForm):LongInt; export; stdcall;begin Application:=ParentApplication; if not Assigned(Form1) then begin Form1:=TForm1.Create(ParentForm); Form1.MyParentForm:=ParentForm; Form1.MyParentApplication:=ParentApplication; Windows.SetParent(Form1.Handle,ParentForm.Handle); Form1.FormStyle:=fsMDIChild; Result:=LongInt(Form1) ; Form1.Show; end else Form1.BringToFront;end;我调用dLL中 ProvaChild 函数创建 MDI窗体 , 刚SHOW出来 就释放 dllHandle肯定报错了!
 
首先 LoadLibrary以后肯定是要FreeLibrary至于你说的不释放也没发现内存泄露,一个方面是因为LoadLibrary以后消耗了系统资源,且这个系统资源在系统空间存在而不是位于用户空间。释放时报错,估计是你使用了涉及跨内存管理器的东东。因为delphi开发的dll和exe使用了不同的内存管理器。你找找这方面的原因。
 
不好意思,回家了几天,一直没上网。我DLL里返回的是接口,我网上查过,好像都有类似的问题,就是静态调用不会出错,动态调用freelibrary就会出错。不知有什么办法解决。
 
后退
顶部