200分!求救Delphi高手!

来源:百度知道 编辑:UC知道 时间:2024/06/20 17:11:42
我自己编写的程序,可能要24小时运行,是用while循环实现的,条件不成立就一直循环下去。其中有一步调用自写函数function simap进行桌面图像对比。程序运行一段时间后,在调用函数simap时,就有可能报错。错误类型还有不同,如下:
1.“Access violation at 7C932C36 in module 'ntdll.dll'. Write of address 00404E71.”
2.“Out of system resources.”
3.“参数不正确。systerm error . code: 87.”
windowsXP SP2和SP3下都一样出错。用的Delphi7
下面是simap的代码:
function simap(const x,y:Integer; abmp:TBitmap):Boolean;
var
cvs:TCanvas;
fbmp:Tbitmap;
m,n,k:Integer;
p1,p:PByteArray;
begin
try
Result:=False;
fbmp:=TBitMap.create;
fbmp.PixelFormat:=pf24bit;
fbmp.HandleType:=bmDIB;
fbmp.Width:=abmp.Width;
fbmp.Height:=abmp.Height;
cvs:=TCanvas.Create;
cvs.Handle:=GetDC(0);
fbmp.Canvas.CopyRect(Rect(0,0,abmp.Width,abmp.Height),cvs,Rect(x,y,x+abmp.Width,y+abmp.Height));
cvs.Free;
k:=0;
for n:=0 to abmp.Height-1 do
begin
p1:=fbmp.scanline[n];
p:=abmp.scanli

(2)、cvs:=TCanvas.Create;
cvs.Handle:=GetDC(0); 这句申请了HDC后,没有在返回前释放句柄。因为cvs.Free;不会关闭HDC以及HDC所对应的窗口句柄,所以会造成句柄泄漏。你的程序要24小时运行,所以会越漏越多,造成Out of system resources。
(1)、(3)、内存不足的时候很可能会爆这样的错误。。。

内存泄漏 你装个fastMM 或者eurekalog 这个能够定位异常到具体的某一行.
可能是你没有closeHandle造成的.
正常的情况下内核句柄 会有一个句柄表 在引用为0就会释放掉.

好像是0分没有人关注的!

楼主你要脸不, 一分没放 还整个200分 求高手?

ReleaseDC