0xC0000005错误的含义是非法访问内存地址,包括读、写、执行三种类型的访问,可能情况有两种:一种是该地址没有分配内存,也就是无效地址,在调试器中查看该地址显示“??”;另一种是该地址不允许指定类型的访问,例如内存地址是只读的,而程序要改写内存中的数据等。
遇到此类问题时,调试程序,在出错时中断,首先查看最终出错的原因,再看代码是不是自己的,如果不是自己的代码,可以根据调用堆栈找出是自己调用了哪个函数引起的问题并定为到调用的代码上,查看相关变量的值,找出存在问题的变量,再查找问题的来源。
如果你的程序是在安装Hook时修改代码出现了这个错误,那是因为代码区默认是不可改写的,需要用VirtualProtect将其改为可写后才能修改。
遇到此类问题时,调试程序,在出错时中断,首先查看最终出错的原因,再看代码是不是自己的,如果不是自己的代码,可以根据调用堆栈找出是自己调用了哪个函数引起的问题并定为到调用的代码上,查看相关变量的值,找出存在问题的变量,再查找问题的来源。
如果你的程序是在安装Hook时修改代码出现了这个错误,那是因为代码区默认是不可改写的,需要用VirtualProtect将其改为可写后才能修改。
定位的位置是在 return HeapAlloc(_crtheap, 0, size ? size : 1); 这句
Pen.CreatePen(PS_SOLID,pF->iCLPixel,RGB(0,0,0));
POINT Pcenter;//////看这里看这里
Pcenter.x = nWidth>>1;
HPEN hOldPen = (HPEN)::SelectObject(hDC,Pen);
....
... // Draw code
SelectObject(hDC, hOldPen);
另外开下任务管理器,看GDI是不是一直在飙升。如果不是那应该是其他地方的问题
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));
也会出现问题
要是把上面都注释就没问题了
要不加上Pen.DeleteObject,虽然觉得加了没什么用。
还有一种可能,是其他地方GDI泄露了(如果把上面的都注释了,GDI没有一丝增长就当我没说)。
然后在任务管理器里找到你的进程,看这个GDI对象是否一直在增加
在你出错的语句前面,尝试 new 一块内存试试。
我把CPen放到外面了,里面只是使用,就解决了,很奇怪,这个是在我封装的类中,我单独写了一个测试这个类的程序,之前放在回调函数里面,测试程序是正常的,好奇怪