0xC0000005错误的含义是非法访问内存地址,包括读、写、执行三种类型的访问,可能情况有两种:一种是该地址没有分配内存,也就是无效地址,在调试器中查看该地址显示“??”;另一种是该地址不允许指定类型的访问,例如内存地址是只读的,而程序要改写内存中的数据等。
遇到此类问题时,调试程序,在出错时中断,首先查看最终出错的原因,再看代码是不是自己的,如果不是自己的代码,可以根据调用堆栈找出是自己调用了哪个函数引起的问题并定为到调用的代码上,查看相关变量的值,找出存在问题的变量,再查找问题的来源。
如果你的程序是在安装Hook时修改代码出现了这个错误,那是因为代码区默认是不可改写的,需要用VirtualProtect将其改为可写后才能修改。

解决方案 »

  1.   

    我觉得是你的这句话有问题:::SelectObject(hDC,Pen);这里应该保存老的画笔指针,在你画完后,应该恢复现场。
      

  2.   

    > KYDSMT.exe!PreviewCallback(HDC__ * hDC=0x220121cd, unsigned char * pImageData=0x09a20020, int nWidth=752, int nHeight=480, int nBitCount=8, void * lpContext=0x0012f6d4)  Line 134 C++定位的位置是在 Pcenter.x = nWidth>>1;  这句  KYDSMT.exe!_heap_alloc_base(unsigned int size=132)  Line 105 + 0x28 bytes C
    定位的位置是在 return HeapAlloc(_crtheap, 0, size ? size : 1); 这句
      

  3.   

    我保存了老画笔,也不行,定位在
                Pen.CreatePen(PS_SOLID,pF->iCLPixel,RGB(0,0,0));
     
            POINT Pcenter;//////看这里看这里
            Pcenter.x = nWidth>>1;
      

  4.   

    你最后需要SelectObject 旧的PEN
    HPEN hOldPen = (HPEN)::SelectObject(hDC,Pen);
    ....
    ... // Draw code
    SelectObject(hDC, hOldPen);
      

  5.   

    从调用堆栈上看应该是GDI泄露导致的崩溃,按理说CreatePen后可以不用DeleteObject,因为CPen的析构会调用到。保存了老画笔后有恢复吗? An application should not delete a pen when the pen is selected in a device context.如果没有恢复可能会有问题。
    另外开下任务管理器,看GDI是不是一直在飙升。如果不是那应该是其他地方的问题
      

  6.   

    这样做了,但是不行,应该在Pen.CreatePen(PS_SOLID,pF->iCLPixel,RGB(0,0,0));有问题,call stack也显示了
      

  7.   

    是的,而且我把画的动作都注释了,只留
            CPen Pen;
            if (pF->iCLColor == 0)//白色
                Pen.CreatePen(PS_SOLID,pF->iCLPixel,RGB(255,255,255));
            else if (pF->iCLColor == 1)//黑色
                Pen.CreatePen(PS_SOLID,pF->iCLPixel,RGB(0,0,0));
    也会出现问题
    要是把上面都注释就没问题了
      

  8.   

    会不会是pF->iCLPixel的值比较离谱?输出下看看。
    要不加上Pen.DeleteObject,虽然觉得加了没什么用。
    还有一种可能,是其他地方GDI泄露了(如果把上面的都注释了,GDI没有一丝增长就当我没说)。
      

  9.   

    pF->iCLPixel这个就是1,我看过了,没什么问题,我看看加deleteobject,然后,怎么看GDI增长?
      

  10.   

    任务管理器-》查看-》选择列-》GDI对象
    然后在任务管理器里找到你的进程,看这个GDI对象是否一直在增加
      

  11.   

    加不加deleteobject,GDI对象个数,都一样,有时候增长下,又回去了
      

  12.   

    这个感觉有点诡异,要不用win32的CreatePen,不用MFC试试吧。
      

  13.   

    我估计是内存被破坏了。
    在你出错的语句前面,尝试 new 一块内存试试。
      

  14.   


    我把CPen放到外面了,里面只是使用,就解决了,很奇怪,这个是在我封装的类中,我单独写了一个测试这个类的程序,之前放在回调函数里面,测试程序是正常的,好奇怪