请教精通dll的高手,DLL封装MDI子窗体,如何在窗体关闭时自动卸载dll,以减少内存占用?
下面是我的代码,exe动态加载dll “baseinfo”,在dll的DLL_PROCESS_DETACH中写了卸载dll语句,实现dll封装的窗体关闭后就卸载dll,好节约内存,现在程序运行不报错,也没内存泄漏,就是当封装的MDI子窗体关闭后,dll不能自动卸载,还占据着内存,请教高手有什么办法能实现动态卸载dll,好节约内存。
library baseinfo;//dll的代码
uses
SysUtils,
Classes,
ADODB,
Windows,
Forms,
d_baseinfo in 'd_baseinfo.pas' {dfmBaseInfo};
var
DllApp:TApplication; //定义变量
{$R *.res}
procedure CallBaseinfo(const app:TApplication;const adocnn:Tadoconnection);stdcall;
begin
Application:=app;
if dfmBaseInfo=nil then
begin
dfmBaseInfo:=TdfmBaseInfo.Create(app);//创建mdi子窗体
dfmBaseInfo.ADOConnection1:=adocnn; //把参数adocnn对象赋给ADOConnection1获得数据库连接
end;
dfmBaseInfo.Show;
end;
procedure MyDLLProc(Reason:Integer);
begin
if Reason=DLL_PROCESS_DETACH then
begin
if Assigned(DllApp) then
Application:=DllApp;
FreeLibrary(Application.Handle); //进程退出时卸载dll
end;
end;
exports
CallBaseinfo;
begin
DllApp:=Application; //把dll的Application先存起来
DllProc:=@MyDLLProc; //
end.
//exe的调用代码
type
PlugIn=function(const app:TApplication;const adocnn:Tadoconnection):integer;stdcall;
……
procedure Tf_main.N3Click(Sender: TObject);
var
ahandle:THandle;
plug:PlugIn;
begin
ahandle:=LoadLibrary('baseinfo.dll') ; //动态加载DLL
try
if ahandle=0 then
exit;
@plug:=GetProcAddress(ahandle,'CallBaseinfo');
if @plug<>nil then
plug(Application,ADOConnection1);
finally
freelibrary(ahandle);
end;
end;