关于非模式对话框错误!!!

老友小明哥 2012-04-25 04:29:28
这个函数我是想实现同时显示多个对话框,点第一次的时候时候正确运行,第二次就出错了,求解答啊!(之前我实现一直能正常运行,现在不知道为什么就出错了)
出错输出:First-chance exception in Image.exe (MFC42D.DLL): 0xC0000005: Access Violation.
对话框显示:Unhandled exception in Image.exe (MFC42D.DLL): 0xC0000005: Access Violation.

void CImageDlg::OnFanse()
{
ClearMemory();
ZengQiang.FanSeBianHuan();
ZengQiang.ZhiFangTu(ZF,0);
CShowImage *Show=new CShowImage;
Show->Create(IDD_DIALOG_SHOW,NULL);
Show->GetHuiDuInfo(ZF);
Show->GetWindowTitle("反色变换");
Show->GetAddr(ZengQiang.GetData(),ZengQiang.GetWidth(),ZengQiang.GetHeight(),ZengQiang.GetInfo());
Show->ShowWindow(SW_SHOW);
// Show=NULL;// TODO: Add your command handler code here
}
...全文
210 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
老友小明哥 2012-04-27
  • 打赏
  • 举报
回复
虽然问题没有解决,还是谢谢以上的朋友,结贴啦!
zgl7903 2012-04-26
  • 打赏
  • 举报
回复
ClearMemory() 怎么写的?
Eleven 2012-04-26
  • 打赏
  • 举报
回复
Debug下打开call stack,看函数调用堆栈~
诶呦 2012-04-26
  • 打赏
  • 举报
回复
1.是VC6.0的话,先删除.ncb文件,rebuild all,看看是不是编译器的BUG
2.恢复到之前的代码,看看两者的区别在哪里
3.如果不能恢复到之前的代码,则屏蔽一些认为可能出错的代码,找到出错原因
stjay 2012-04-26
  • 打赏
  • 举报
回复
可能的话,还是上传整个工程吧
猜猜下不是办法
老友小明哥 2012-04-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

你要这么说那就不好判断了
[/Quote]

CPaintDC dc(this);
SetWindowText(TheTitle);
CWnd *pWnd = GetDlgItem(IDC_BMPSHOW2);
pWnd->UpdateWindow();

// device context for painting

CRect Rect;
HDC HCtrlDC;
HCtrlDC=::GetDC(::GetDlgItem((this->m_hWnd),IDC_BMPSHOW2));
GetWindowRect(&Rect);
ScreenToClient(&Rect);
SetStretchBltMode(HCtrlDC, COLORONCOLOR);
StretchDIBits(HCtrlDC, //控件DC
0, //控件X方向偏移
0, //控件Y方向偏移
Rect.right - Rect.left, //显示窗口宽度
Rect.bottom - Rect.top, //显示窗口高度
0,
0,
BMPWidth , //图像宽度
BMPHeigh , //图像高度
BMPAddr, //图像数据内存首指针
BMPInfo, //BITMAPINFO Structure
DIB_RGB_COLORS,
SRCCOPY
);

::ReleaseDC(::GetDlgItem((this->m_hWnd),IDC_BMPSHOW2),HCtrlDC);


00404E92 push 3E9h
00404E97 mov ecx,dword ptr [ebp-10h]
00404E9A call CWnd::GetDlgItem (00405dec)
00404E9F mov dword ptr [ebp-68h],eax
107: pWnd->UpdateWindow();
00404EA2 mov ecx,dword ptr [ebp-68h]
00404EA5 call CWnd::UpdateWindow (00405de6)

+ pWnd 0x00000000 {CWnd hWnd=???}

第二次打开pWnd地址就为空了,求解答!
老友小明哥 2012-04-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

你要这么说那就不好判断了
[/Quote]
再一步定位:

void CShowImage::OnPaint()
{
// CPaintDC dc(this); // device context for painting
//

CPaintDC dc(this);
SetWindowText(TheTitle);
CWnd *pWnd = GetDlgItem(IDC_BMPSHOW2);
pWnd->UpdateWindow();
// device context for painting

CRect Rect;
HDC HCtrlDC;
HCtrlDC=::GetDC(::GetDlgItem((this->m_hWnd),IDC_BMPSHOW2));
GetWindowRect(&Rect);
ScreenToClient(&Rect);
SetStretchBltMode(HCtrlDC, COLORONCOLOR);
StretchDIBits(HCtrlDC, //控件DC
0, //控件X方向偏移
0, //控件Y方向偏移
Rect.right - Rect.left, //显示窗口宽度
Rect.bottom - Rect.top, //显示窗口高度
0,
0,
BMPWidth , //图像宽度
BMPHeigh , //图像高度
BMPAddr, //图像数据内存首指针
BMPInfo, //BITMAPINFO Structure
DIB_RGB_COLORS,
SRCCOPY
);

::ReleaseDC(::GetDlgItem((this->m_hWnd),IDC_BMPSHOW2),HCtrlDC);

}


00404E92 push 3E9h
00404E97 mov ecx,dword ptr [ebp-10h]
00404E9A call CWnd::GetDlgItem (00405dec)
00404E9F mov dword ptr [ebp-68h],eax
107: pWnd->UpdateWindow();
00404EA2 mov ecx,dword ptr [ebp-68h]
00404EA5 call CWnd::UpdateWindow (00405de6)

+ pWnd 0x00000000 {CWnd hWnd=???}

新发现:为什么第二运行pWnd就为空呢?


software工程师 2012-04-26
  • 打赏
  • 举报
回复
Show->GetHuiDuInfo(ZF);
Show->GetWindowTitle("反色变换");
Show->GetAddr(ZengQiang.GetData(),ZengQiang.GetWidth(),ZengQiang.GetHeight(),ZengQiang.GetInfo());
这三句都屏蔽试下,如果是OK的,再挨个屏蔽,先确定是哪句问题
老友小明哥 2012-04-26
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

ClearMemory() 怎么写的?
[/Quote]

因为读图片的需要,只是把原始的图片信息再复制过来。这个函数即使删除了,也会出现同样的错误,所以应该不是这个函数的错误!!
老友小明哥 2012-04-26
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

Debug下打开call stack,看函数调用堆栈~
[/Quote]

不知道怎样看!!看这个有什么用??
向立天 2012-04-25
  • 打赏
  • 举报
回复
你要这么说那就不好判断了
老友小明哥 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 7 楼 的回复:
引用 5 楼 的回复:

你调试一下 看看错在哪里

兄弟,如果我能调试得出来,我就不用发帖了!!谢谢你的回答啊!

这么说你会调试
那应该单步调试一下看看究竟哪句出的问题
就你这些代码来看虽有也有漏洞但不至于崩溃
唯一可以的就是这个ZF的处理
从字面上看应该是直方图
不知道操作操作这个ZF会不会引起访问越界
不过那就看你自己调试了
[/Quote]

可能我不是很精通调试吧,我调试出来是在Create那里出错,当然不知道为什么,而且之前我做的,是不会出错的,后来不知道改动了哪里,结果就错了,那个ZF的确是直方图。如果是越界的话,第一次运行就出错了。为什么会第二次运行才出错呢?谢谢你的回答!
老友小明哥 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

从报错信息看到是MFC42D.DLL模块里异常
即是说不是CImageDlg::OnFanse()里的指针异常
感觉着3个函数有问题
Show->GetHuiDuInfo
Show->GetWindowTitle //特别是这个,是SetWindowTitle ??
Show->GetAddr
按照命名习惯,Get开头的函数都是获取数据的
如果Show->GetWindowTit……
[/Quote]

首先,很高兴你能回答我的问题,但是我也把函数名改了一下,发现还是错。而且你所说的“Show->GetWindowTitle内部调用GetWindowText”,我函数内部并没有调用GetWindowText。
向立天 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 5 楼 的回复:

你调试一下 看看错在哪里

兄弟,如果我能调试得出来,我就不用发帖了!!谢谢你的回答啊!
[/Quote]
这么说你会调试
那应该单步调试一下看看究竟哪句出的问题
就你这些代码来看虽有也有漏洞但不至于崩溃
唯一可以的就是这个ZF的处理
从字面上看应该是直方图
不知道操作操作这个ZF会不会引起访问越界
不过那就看你自己调试了
stjay 2012-04-25
  • 打赏
  • 举报
回复
从报错信息看到是MFC42D.DLL模块里异常
即是说不是CImageDlg::OnFanse()里的指针异常
感觉着3个函数有问题
Show->GetHuiDuInfo
Show->GetWindowTitle //特别是这个,是SetWindowTitle ??
Show->GetAddr
按照命名习惯,Get开头的函数都是获取数据的
如果Show->GetWindowTitle内部是调用GetWindowText,传进的是常量区内存,就会包非法访问了
其它两个类似
MFC封装了这些函数,在MFC42D.DLL里出现异常,那上述问题就比较吻合。
老友小明哥 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

你调试一下 看看错在哪里
[/Quote]
兄弟,如果我能调试得出来,我就不用发帖了!!谢谢你的回答啊!
老友小明哥 2012-04-25
  • 打赏
  • 举报
回复
自己顶一下!!
  • 打赏
  • 举报
回复
你调试一下 看看错在哪里
老友小明哥 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

先看出错的地方,应该是指针没有处理好
[/Quote]

在网上搜了很久,很多人都说是指针问题,但是我看了N遍都找不到那个指针出了问题。所有定义几乎都在这个函数内了。
oyljerry 2012-04-25
  • 打赏
  • 举报
回复
先看出错的地方,应该是指针没有处理好
加载更多回复(2)

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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