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

解决方案 »

  1.   

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

  2.   

    从你贴的错误信息上看不出具体问题何在,估计是内存没释放,或者数据库的问题。关键是你没必要一直比对,你应该写一个APIHook(例子代码网上多得很),接管InvalidateRect、InvalidateRgn,有更新区域之后再存。
      

  3.   

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

  4.   

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

  5.   

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

  6.   

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

  7.   

    是啊,有时会出现“存储空间不足”这样的问题,我用的是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:0009C9CCBound resource filesd:\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
      

  8.   

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