L
liangexcel
Unregistered / Unconfirmed
GUEST, unregistred user!
一个MDI+DLLChild程序,程序分几个模块,每个模快做成一个DLL,每个DLL内有数个子窗体.
主程序刚启动时,内存占用是17M(任务管理器中),调用DLL中的子窗体,打开数据库并显示,大约再耗掉2M左右内存,之后每打开一个窗体耗掉内存大约也是1-2M左右.但当我关闭关释放当前的一个子窗体,任务管理器中的内存根本没有变化(不减少),当我把所有窗体都关闭,并用FreeLibrary释放DLL,内存还是没有变化。但当我再次调用这个DLL,打开子窗体时,内存耗用却在继续增加,但却没有第一次打开时占用那么多,大约是几百K左右。这是怎么回事?难道DLL的内存不能释放的吗?为何再次调用DLL时,内存反正继续增加?
//窗体创建过程
function frmNumOpen(AHandle: THandle; AForm: TForm):Longint;stdcall;
begin
if not Assigned(DM) then
DM := TDM.Create(Application);
frmNum := TfrmNum.Create(AForm);
frmNum.zHandle := AHandle;
result := Longint(frmNum);
end;
//窗体关闭过程
procedure frmNumClose; StdCall;
begin
if assigned(frmNum) then
begin
FreeAndNil(frmNum);
end;
// if not Assigned(frmNum) then
// FreeAndNil(DM);
end;
//当点击关闭按错时,发错信息给主程序,关闭子窗体
procedure TfrmNum.FormClose(Sender: TObject; var Action: TCloseAction);
begin
postMessage (zhandle, WM_MyMsg1, 1,0);
end;
//主程序关闭及释放的过程,先释放窗体,再判断有没有存在指定DLL内的窗体存在,如果没有了,则释放DLL
1: if Assigned(frmNum_Basic_Close) then
begin
frmNum_Basic_Close;
AfrmNum_Basic := nil;
if DestroyD_Num then
begin
FreeLibrary(D_NumHandle);
D_NumHandle := 0;
end;
end
主程序刚启动时,内存占用是17M(任务管理器中),调用DLL中的子窗体,打开数据库并显示,大约再耗掉2M左右内存,之后每打开一个窗体耗掉内存大约也是1-2M左右.但当我关闭关释放当前的一个子窗体,任务管理器中的内存根本没有变化(不减少),当我把所有窗体都关闭,并用FreeLibrary释放DLL,内存还是没有变化。但当我再次调用这个DLL,打开子窗体时,内存耗用却在继续增加,但却没有第一次打开时占用那么多,大约是几百K左右。这是怎么回事?难道DLL的内存不能释放的吗?为何再次调用DLL时,内存反正继续增加?
//窗体创建过程
function frmNumOpen(AHandle: THandle; AForm: TForm):Longint;stdcall;
begin
if not Assigned(DM) then
DM := TDM.Create(Application);
frmNum := TfrmNum.Create(AForm);
frmNum.zHandle := AHandle;
result := Longint(frmNum);
end;
//窗体关闭过程
procedure frmNumClose; StdCall;
begin
if assigned(frmNum) then
begin
FreeAndNil(frmNum);
end;
// if not Assigned(frmNum) then
// FreeAndNil(DM);
end;
//当点击关闭按错时,发错信息给主程序,关闭子窗体
procedure TfrmNum.FormClose(Sender: TObject; var Action: TCloseAction);
begin
postMessage (zhandle, WM_MyMsg1, 1,0);
end;
//主程序关闭及释放的过程,先释放窗体,再判断有没有存在指定DLL内的窗体存在,如果没有了,则释放DLL
1: if Assigned(frmNum_Basic_Close) then
begin
frmNum_Basic_Close;
AfrmNum_Basic := nil;
if DestroyD_Num then
begin
FreeLibrary(D_NumHandle);
D_NumHandle := 0;
end;
end