【求助】0xC0000005异常问题

肆水東澤 2014-08-01 02:40:51
程序抛出异常
First-chance exception at 0x7c809eda in xxx.exe:0xC0000005:Access violation reading location 0x31013638
代码如下:

void WINAPI PreviewCallback(HDC hDC,
unsigned char *pImageData,
int nWidth,
int nHeight,
int nBitCount,
void *lpContext)
{
CKYDCamera * pF = (CKYDCamera*)lpContext;
if (pF->bCrossLine)
{
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));

POINT Pcenter;
Pcenter.x = nWidth>>1;
Pcenter.y = nHeight>>1;
::SelectObject(hDC,Pen);
::MoveToEx(hDC,0,Pcenter.y,NULL);
::LineTo(hDC,nWidth,Pcenter.y);
::MoveToEx(hDC,Pcenter.x,0,NULL);
::LineTo(hDC,Pcenter.x,nHeight);

int iGap = nWidth/pF->iSpacing;
for(int i=1;i<pF->iDividing;i++)//先画横向
{
if (i%2 != 0)//余数不等于0,画短的
{
::MoveToEx(hDC,Pcenter.x-i*iGap,Pcenter.y+iGap/2,NULL);//左边的
::LineTo(hDC,Pcenter.x-i*iGap,Pcenter.y-iGap/2);
::MoveToEx(hDC,Pcenter.x+i*iGap,Pcenter.y+iGap/2,NULL);//右边的
::LineTo(hDC,Pcenter.x+i*iGap,Pcenter.y-iGap/2);
}
else//画长的
{
::MoveToEx(hDC,Pcenter.x-i*iGap,Pcenter.y+iGap,NULL);//上边的
::LineTo(hDC,Pcenter.x-i*iGap,Pcenter.y-iGap);
::MoveToEx(hDC,Pcenter.x+i*iGap,Pcenter.y+iGap,NULL);//下边的
::LineTo(hDC,Pcenter.x+i*iGap,Pcenter.y-iGap);
}
}
iGap = nHeight/pF->iSpacing;
for(int i=1;i<pF->iDividing;i++)//画纵向
{
if (i%2 != 0)//余数不等于0,画短的
{
::MoveToEx(hDC,Pcenter.x+iGap/2,Pcenter.y-i*iGap,NULL);//左边的
::LineTo(hDC,Pcenter.x-iGap/2,Pcenter.y-i*iGap);
::MoveToEx(hDC,Pcenter.x+iGap/2,Pcenter.y+i*iGap,NULL);//右边的
::LineTo(hDC,Pcenter.x-iGap/2,Pcenter.y+i*iGap);
}
else//画长的
{
::MoveToEx(hDC,Pcenter.x+iGap,Pcenter.y-i*iGap,NULL);//上边的
::LineTo(hDC,Pcenter.x-iGap,Pcenter.y-i*iGap);
::MoveToEx(hDC,Pcenter.x+iGap,Pcenter.y+i*iGap,NULL);//下边的
::LineTo(hDC,Pcenter.x-iGap,Pcenter.y+i*iGap);
}
}
}

}

这个就是个相机的采集回调函数,每次有图返回时调用,画十字线,调试Call stack,显示下面内容,求助大神,什么问题
...全文
740 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
肆水東澤 2014-08-01
  • 打赏
  • 举报
回复
引用 14 楼 zhousitiaoda 的回复:
这个感觉有点诡异,要不用win32的CreatePen,不用MFC试试吧。
引用 12 楼 zhousitiaoda 的回复:
任务管理器-》查看-》选择列-》GDI对象 然后在任务管理器里找到你的进程,看这个GDI对象是否一直在增加
我把CPen放到外面了,里面只是使用,就解决了,很奇怪,这个是在我封装的类中,我单独写了一个测试这个类的程序,之前放在回调函数里面,测试程序是正常的,好奇怪
Saleayas 2014-08-01
  • 打赏
  • 举报
回复
我估计是内存被破坏了。 在你出错的语句前面,尝试 new 一块内存试试。
zhousitiaoda 2014-08-01
  • 打赏
  • 举报
回复
这个感觉有点诡异,要不用win32的CreatePen,不用MFC试试吧。
肆水東澤 2014-08-01
  • 打赏
  • 举报
回复
引用 12 楼 zhousitiaoda 的回复:
任务管理器-》查看-》选择列-》GDI对象 然后在任务管理器里找到你的进程,看这个GDI对象是否一直在增加
加不加deleteobject,GDI对象个数,都一样,有时候增长下,又回去了
zhousitiaoda 2014-08-01
  • 打赏
  • 举报
回复
任务管理器-》查看-》选择列-》GDI对象 然后在任务管理器里找到你的进程,看这个GDI对象是否一直在增加
肆水東澤 2014-08-01
  • 打赏
  • 举报
回复
引用 10 楼 zhousitiaoda 的回复:
会不会是pF->iCLPixel的值比较离谱?输出下看看。 要不加上Pen.DeleteObject,虽然觉得加了没什么用。 还有一种可能,是其他地方GDI泄露了(如果把上面的都注释了,GDI没有一丝增长就当我没说)。
pF->iCLPixel这个就是1,我看过了,没什么问题,我看看加deleteobject,然后,怎么看GDI增长?
zhousitiaoda 2014-08-01
  • 打赏
  • 举报
回复
会不会是pF->iCLPixel的值比较离谱?输出下看看。 要不加上Pen.DeleteObject,虽然觉得加了没什么用。 还有一种可能,是其他地方GDI泄露了(如果把上面的都注释了,GDI没有一丝增长就当我没说)。
肆水東澤 2014-08-01
  • 打赏
  • 举报
回复
引用 7 楼 zhousitiaoda 的回复:
从调用堆栈上看应该是GDI泄露导致的崩溃,按理说CreatePen后可以不用DeleteObject,因为CPen的析构会调用到。保存了老画笔后有恢复吗? An application should not delete a pen when the pen is selected in a device context.如果没有恢复可能会有问题。 另外开下任务管理器,看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)); 也会出现问题 要是把上面都注释就没问题了
肆水東澤 2014-08-01
  • 打赏
  • 举报
回复
引用 6 楼 VisualEleven 的回复:
你最后需要SelectObject 旧的PEN HPEN hOldPen = (HPEN)::SelectObject(hDC,Pen); .... ... // Draw code SelectObject(hDC, hOldPen);
这样做了,但是不行,应该在Pen.CreatePen(PS_SOLID,pF->iCLPixel,RGB(0,0,0));有问题,call stack也显示了
zhousitiaoda 2014-08-01
  • 打赏
  • 举报
回复
从调用堆栈上看应该是GDI泄露导致的崩溃,按理说CreatePen后可以不用DeleteObject,因为CPen的析构会调用到。保存了老画笔后有恢复吗? An application should not delete a pen when the pen is selected in a device context.如果没有恢复可能会有问题。 另外开下任务管理器,看GDI是不是一直在飙升。如果不是那应该是其他地方的问题
Eleven 2014-08-01
  • 打赏
  • 举报
回复
你最后需要SelectObject 旧的PEN HPEN hOldPen = (HPEN)::SelectObject(hDC,Pen); .... ... // Draw code SelectObject(hDC, hOldPen);
feixiang36 2014-08-01
  • 打赏
  • 举报
回复
内存相关的问题,查查是否越界了。
肆水東澤 2014-08-01
  • 打赏
  • 举报
回复
引用 2 楼 shenyi0106 的回复:
我觉得是你的这句话有问题:

::SelectObject(hDC,Pen);
这里应该保存老的画笔指针,在你画完后,应该恢复现场。
我保存了老画笔,也不行,定位在 Pen.CreatePen(PS_SOLID,pF->iCLPixel,RGB(0,0,0)); POINT Pcenter;//////看这里看这里 Pcenter.x = nWidth>>1;
肆水東澤 2014-08-01
  • 打赏
  • 举报
回复
> 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); 这句
lx624909677 2014-08-01
  • 打赏
  • 举报
回复
0xC0000005错误的含义是非法访问内存地址,包括读、写、执行三种类型的访问,可能情况有两种:一种是该地址没有分配内存,也就是无效地址,在调试器中查看该地址显示“??”;另一种是该地址不允许指定类型的访问,例如内存地址是只读的,而程序要改写内存中的数据等。 遇到此类问题时,调试程序,在出错时中断,首先查看最终出错的原因,再看代码是不是自己的,如果不是自己的代码,可以根据调用堆栈找出是自己调用了哪个函数引起的问题并定为到调用的代码上,查看相关变量的值,找出存在问题的变量,再查找问题的来源。 如果你的程序是在安装Hook时修改代码出现了这个错误,那是因为代码区默认是不可改写的,需要用VirtualProtect将其改为可写后才能修改。
shenyi0106 2014-08-01
  • 打赏
  • 举报
回复
我觉得是你的这句话有问题:

::SelectObject(hDC,Pen);
这里应该保存老的画笔指针,在你画完后,应该恢复现场。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧