高手看过来!!dll调用,内存泄漏。(80分)

  • 主题发起人 主题发起人 wenqihe
  • 开始时间 开始时间
W

wenqihe

Unregistered / Unconfirmed
GUEST, unregistred user!
dll内存问题:
环境: delphi6 nt2000 server
我做了一个主程序和几个dll,主程序调用dll,释放dll
从逻辑上我看不出有任何内存泄漏,但是在任务管理器中发现我每次调用dll
内存增长一些,释放dll后,内存释放一些,但是占用的内存大小比调用dll前大
4k或8k或其他。同时我发现,执行程序后到鼠标点机选中程序之间,内存占用也增长4k

这是什么原因,不会是任务管理器的问题吧

我的相关代码:
DLL部分:

Function ShowMainForm(AHandle:THandle;Parent:TWinControl;
Top:Integer;Left:Integer
):Longint;
begin
Result:=-1;
if Not Assigned(UserAdminForm) then
try
Application.Handle:=AHandle;
UserAdminForm:=TUserAdminForm.Create(Application);
UserAdminForm.Top:=Top;
UserAdminForm.Left:=Left;
Windows.SetParent(UserAdminForm.Handle,Parent.Handle);
UserAdminForm.Show;
Result:=Longint(UserAdminForm);
except
end;
end;

procedure TUserAdminForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
PostMessage(Application.Handle,WM_DLLCLOSE,Longint(UserAdminForm),0);
//关闭Form时,往主程序发送关闭Form的消息
UserAdminForm:=nil;
Action:=CaFree;
end;

主程序部分:
Procedure TFormMain.MenuClick(Sender:Tobject);
//调用dll
var
LibHandle:THandle;
pShowMainForm:TShowMainForm;
DllName:String;
vResult:Longint;
LoadSuccess:Boolean;
begin
LoadSuccess:=true;
LibHandle:=LoadLibrary(PChar(GetCurrentDir+'/dll/abc.dll'));
try
if LibHandle=0 then
begin
ShowMessage('不能装载 ./dll/abc.dll');
LoadSuccess:=false;
end;
@pShowMainForm:=GetProcAddress(LibHandle,'ShowMainForm');
if not (@pShowMainForm=nil) then
begin
VResult:=pShowMainForm(Application.Handle,ScrollBox1,gTop,gLeft);
if vResult=-1 then
LoadSuccess:=false;
end
else
begin
ShowMessage('从CommonDLLAPP.dll中获取过程pShowMainForm出错');
LoadSuccess:=false;
end;
Finally
if LoadSuccess=false then FreeLibrary(LibHandle);
end;
end;
...
end;


Procedure TFormMain.OnAppMessage(var Msg:TMsg;var handled:Boolean);
var vWparam,vLparam:WPARAM;
//释放dll
begin
if Msg.message=WM_DLLCLOSE then
//关闭dll Form
begin
//delete cooperation menuitem
vWparam:=Msg.wParam;
vLparam:=Msg.lParam;
...
FreeLibrary(THandle(vMenuItem.ImageIndex));
//vMenuItem.ImageIndex里面放置的是dll的句柄
end;
end;

我用boundscheck for delphi检查,没有发现内存泄漏的错误
(我特意测试了一下,如果不关闭DLLForm,直接关闭主程序,会报内存泄漏错误)
注 我的程序实际上如果有DLLFORM没有关闭,主程序不能关闭

BTW:
如何将bounds checker for delphi65集成到delphi6中
我现在只能进行最原始的检测,在delphi中修改applicaion的选项,编译。在bounds checker
中打开运行程序进行监测。
那位有这方面的经验,赐教一下

3x
 
why no answer
too easy?
 
在Windows95/98下执行程序时,经常会出现此种情况,如果你的机器开了一整天,
并且经常开关程序,如 IE,或浏览文件夹,你会发现系统变得非常的慢,可用内存
也会减小.
Windows2000下此问题得到改善,但也不Perfect.
 
我也想知道如何进行内存泄漏测试!
 
to hhb1981
我总是觉得程序有问题,要不然调用DLL,释放DLL都会增加内存的占用
 
老办法,Kill它:
procedure TForm1.Button1Click(Sender: TObject);
var
H:THandle;
P:DWORD;
begin
H:=FindWindow(nil,'无标题 - 记事本');
if H<>0 then
begin
GetWindowThreadProcessId(H,@P);
if P<>0 then
TerminateProcess(OpenProcess(PROCESS_TERMINATE,False,P),$FFFFFFFF);
end;
end;
 
to: rainxy2002
有点不大明白。你kill掉的是进程还是DLL,我怎么用你的代码是kill掉进程了
二我想要kill DLL,并全部释放内存。
3x
 
当然是进程了,进程一删除DLL自然就释放了,
把上例中的 '无标题 - 记事本'----->你的DLL中的窗体Caption就行了,
很容易的
 
我也想知道如何集成进delphi,安装完毕delphi一点变化都没有。
 
wenqihe:和你交流一下boundschecker好不好?
my oicq:1005736
 
to rainxy2002:
kill进程!我当时还以为我理解错了,kill进程对于我来说没有用处。
我所说的内存泄漏不是程序关闭后还有内存没有释放,而是程序执行中每次打开dll,再
关闭DLL后,内存占用比调用DLL前大4k、8k、12k...不等

to 远帆:
我没有qq,你可以发mail给我。
 
wenqihe@sina.com.cn
 
有没有在工程中加进dcu
uses sharemem;
 
have added it every app and dll
 
难道大家编程的时候不大关心内存变化的问题?
 
多人接受答案了。
 
后退
顶部