做了个截屏后比较的程序,运行一段时间后就出现错误。

时间:2022-04-19 15:24:16
为了查看上班时间用电脑做什么,思路是:在电脑启动时自动运行程序(截图后让两个图片内容一样),判断是否在上班时间,如果在上班时间,屏幕有变化(图1将重新截,然后用ScanLine比较两图)则将变化存入数据库。如果屏幕无变化则不存。现在问题是程序运行一段时间后就出现错误:有时是内存地址占用问题,有时是存储空间不足问题,怎么回事?是我的bitmap没正确释放?

12 个解决方案

#1


出现的错误和这个差不多。http://www.fzyw.cn/111.jpg

#2


从你贴的错误信息上看不出具体问题何在,估计是内存没释放,或者数据库的问题。

关键是你没必要一直比对,你应该写一个APIHook(例子代码网上多得很),接管InvalidateRect、InvalidateRgn,有更新区域之后再存。

#3


内存访问出错,查你的程序是否有内存泄漏.测试程序时将编译项的Runtime errors全部打开,或用第三方的测试工具(如boundcheck)对程序进行测试.

#4


to DelphiGuy:
我没有一直比较,就是在两个截图中取一个区域进行比较,如果有一点不一样就退出比较,然后保存。

#5


那你不是一直在截图、比对吗?:)

#6


也是,如果图有不同,反而比较的少。你说的APIHook我不会用啊。我是个自学的,只是自己玩玩,能教我怎么进行你说的---(接管InvalidateRect、InvalidateRgn,有更新区域之后再存。)吗?

#7


对于这类内存出错,可以根据报错信息找到源代码行,然后就好定位了,给你一个方法供你参考,百试百灵:

Access violation是程序中最常见的一种错误,但是我们可以利用Access violation的提示信息,定位到源代码的具体位置,例如:Access violation at address 005B21FE in module Project1.exe'. Read of address 8080809C,其中005B21FE就是MAP地址,我们只要用这个公式:005B21FE-400000-1000=1B11FE,然后通过源代码生成的MAP文件找到最近的位置,就可以定位了。MAP文件的结构为:2997 0001:001B11F3 3000 0001:001B1207,它是和源代码对应的,前面是源代码行,后面是MAP地址,在DELPHI中生成MAP文件的选项是:Project->Options->Linker->Map file->选中Detailed

#8


先谢谢了。现在就试试看。不过我的程序不是每一运行就这样的,有时运行一天后才出现这个问题。

#9


那可能是存储的时候出了问题。

#10


是啊,有时会出现“存储空间不足”这样的问题,我用的是ACCESS,可有时才几M啊。
MAP文件末尾Line numbers for Project1(H:\拍照\Project1.dpr) segment .text

     9 0001:0009C98C    10 0001:0009C99C    11 0001:0009C9A8    12 0001:0009C9C0
    13 0001:0009C9CC

Bound resource files

d:\program files\borland\delphi7\Lib\Buttons.res
d:\program files\borland\delphi7\Lib\ExtDlgs.res
d:\program files\borland\delphi7\Lib\Controls.res
Unit1.dfm
Project1.res
Project1.drf


Program entry point at 0001:0009C98C

#11


存储空间不足时,看看是否是存储文件超限了
还有你那比较的时间间隔是怎么控制的?

#12


是用的timer控件,每两秒截一个图片比较。还有个问题,用SCANLINE时能隔行比较吗?

#1


出现的错误和这个差不多。http://www.fzyw.cn/111.jpg

#2


从你贴的错误信息上看不出具体问题何在,估计是内存没释放,或者数据库的问题。

关键是你没必要一直比对,你应该写一个APIHook(例子代码网上多得很),接管InvalidateRect、InvalidateRgn,有更新区域之后再存。

#3


内存访问出错,查你的程序是否有内存泄漏.测试程序时将编译项的Runtime errors全部打开,或用第三方的测试工具(如boundcheck)对程序进行测试.

#4


to DelphiGuy:
我没有一直比较,就是在两个截图中取一个区域进行比较,如果有一点不一样就退出比较,然后保存。

#5


那你不是一直在截图、比对吗?:)

#6


也是,如果图有不同,反而比较的少。你说的APIHook我不会用啊。我是个自学的,只是自己玩玩,能教我怎么进行你说的---(接管InvalidateRect、InvalidateRgn,有更新区域之后再存。)吗?

#7


对于这类内存出错,可以根据报错信息找到源代码行,然后就好定位了,给你一个方法供你参考,百试百灵:

Access violation是程序中最常见的一种错误,但是我们可以利用Access violation的提示信息,定位到源代码的具体位置,例如:Access violation at address 005B21FE in module Project1.exe'. Read of address 8080809C,其中005B21FE就是MAP地址,我们只要用这个公式:005B21FE-400000-1000=1B11FE,然后通过源代码生成的MAP文件找到最近的位置,就可以定位了。MAP文件的结构为:2997 0001:001B11F3 3000 0001:001B1207,它是和源代码对应的,前面是源代码行,后面是MAP地址,在DELPHI中生成MAP文件的选项是:Project->Options->Linker->Map file->选中Detailed

#8


先谢谢了。现在就试试看。不过我的程序不是每一运行就这样的,有时运行一天后才出现这个问题。

#9


那可能是存储的时候出了问题。

#10


是啊,有时会出现“存储空间不足”这样的问题,我用的是ACCESS,可有时才几M啊。
MAP文件末尾Line numbers for Project1(H:\拍照\Project1.dpr) segment .text

     9 0001:0009C98C    10 0001:0009C99C    11 0001:0009C9A8    12 0001:0009C9C0
    13 0001:0009C9CC

Bound resource files

d:\program files\borland\delphi7\Lib\Buttons.res
d:\program files\borland\delphi7\Lib\ExtDlgs.res
d:\program files\borland\delphi7\Lib\Controls.res
Unit1.dfm
Project1.res
Project1.drf


Program entry point at 0001:0009C98C

#11


存储空间不足时,看看是否是存储文件超限了
还有你那比较的时间间隔是怎么控制的?

#12


是用的timer控件,每两秒截一个图片比较。还有个问题,用SCANLINE时能隔行比较吗?