DLL问题,想不出来,帮帮我。(100分)

  • 主题发起人 主题发起人 delphi5988
  • 开始时间 开始时间
D

delphi5988

Unregistered / Unconfirmed
GUEST, unregistred user!
1/不知为什么,怎么不管是动态引入还是静态引入,这个DLL的内存用完全就是不能释放
大家说说,这是怎么处理,内存问题的,因为我的软件要常驻内存,所以,占内存很多,
我想用动态引入DLL,用完全再 释放内存。请帮帮我!

2/这个如果把多线程写入DLL中怎么结束多线程这是一个问题.

各位兄弟帮帮我!谢谢
library Project2;

uses
SysUtils,
Classes,StdCtrls;

{$R *.res}
procedure showme(listbox:Tlistbox);stdcall;
var
i:integer;
begin
for i:=0 to 20000 do
begin
listbox.Items.Add(intTostr(i));
end;
end;

exports
showme;
begin

end.


---------------------下面是UNIT单元文件

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
ListBox1: TListBox;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

Tshowme=procedure(listbox:Tlistbox);stdcall;

var
Form1: TForm1;


implementation

procedure TForm1.Button2Click(Sender: TObject);
var
ww:tshowme;
a:Thandle;
begin
a:=loadlibrary('project2.dll');
try
if a<>0 then
begin
@ww:=GetProcAddress(a,'showme');
ww(form1.ListBox1);
end;
finally
FreeLibrary(a);
end;
end;
 
静态引用的缺点是在装载PE文件时,就检测DLL文件及其函数
如果有错误那么程序会终止

而动态的则是在需要调用函数时动态调入,弹性大,用完可以用FREELIBRARY
来释放DLL
 
上面的代码是可以运行成功的,但是就是占用内存,我是说能不能使DLL用完后就,释放内存 释放内存 释放内存
 
在函数执行期间,站用内存是正常的啊
 
dll中是否有分配的内存未回收?对象未释放?
 
上面的代码是可以运行成功的,但是就是占用内存,我是说能不能使DLL用完后就,释放内存 释放内存 释放内存

就是上面的代码,内存占用很大,请帮助一下
 
数据量大,有点慢,也是正常的;
 
初学,不懂得,帮你顶,快解决
 
这里主要是讨论内存的释放问题,就是说,DLL引用后,用完DLL中的函数后,能不能把这个DLL占用的内存给释放
 
第一,你怎知道它没有释放
第2 DLL中的函数是谁写的,是否有问题
 
你的代码已经把DLL占用的内存释放了,不信你在FreeLibrary(a);后再调用一次ww看看,会出错的。

至于你说的占用内存多,是其它原因吧。
 
procedure showme(listbox:Tlistbox);stdcall;
var
i:integer;
begin
for i:=0 to 20000 do
begin
listbox.Items.Add(intTostr(i));
end;
end;
你的参数listbox是外部传进来的,实际上是主程序的一个控件,而dll只是把这个控件的Items增加了2万个(每次调用),如果你的主程序listbox不释放分配的items(比如,不clear)则,每次增加的内存都是listbox占有的,dll释放不影响这个listbox,问题不是dll的,是你的主程序的.

另外,如果你在dll里面引用了主程序的某个控件(或者class),最好在两个程序的uses语句前面第一行引用ShareMem单元.不过这个和你的问题无关,只是避免程序退出的时候报告指针错误.
 
其实最好不要传递控件到DLL中,为什么要这样做呢?这样也不通用呀
DLL本身占用的内存释放了,但控件所占用的内存那要主程序中释放。
 
关注 。
回去看看 。
 
uses ShareMem ;
 
zqw0117

你说的很有道理,但是能不能帮帮我,改一改主程序,怎么释放,谢了
 
procedure TForm1.Button2Click(Sender: TObject);
var
ww:tshowme;
a:Thandle;
begin
a:=loadlibrary('project2.dll');
try
if a<>0 then
begin
@ww:=GetProcAddress(a,'showme');
[red]form1.ListBox1.Clear;[/red]//这里加一句,就保证Listbox只有最多2万行,不会再多了.不过,记住,在dll的dpr文件的uses语句中第一行引用ShareMem,然后再在主程序dpr文件的uses语句中第一行,引用ShareMem,最后同时编译exe和dll后在运行exe测试
ww(form1.ListBox1);
end;
finally
FreeLibrary(a);
end;
end;
 
form1.ListBox1.Clear;//
加上这句只是再次执行时把ListBox1的内容清空,运行时dll肯定要占内存的。
至于运行后还有没有占内存。
俺不知道。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
854
import
I
I
回复
0
查看
666
import
I
后退
顶部