MFC探秘.pdf

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
MFC探秘

如果你的程序在运行后输出窗口也出现了一下提示:1.exe 中的 0x642bdd8a (mfc80ud.dll) 处最可能的异 常: 0xC0000005: 读取位置 0 时发生访问冲突 那么请注意了,这不是你打包程序发生的错误,你可以自己在调试中设置成release 后调试,然后拿到试 验机上看看是否程序会自己出错(一个朋友的提示,很感激),如果不是,那么你只能另寻原因了。。如 果是那么继续。。你可以在每次的调用函数中设置断点来查看是什么时候再输出窗口上出现的0xC0000005: 读取位置 0 时发生访问冲突异常,然后找到出错地方,修改。 下面是我出错的地方。。 这是我响应的WM_SIZE 函数,然后调用了自己写的一个Resize();函数 void CMy1Dlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); // TODO: 在此处添加消息处理程序代码 Resize(cx,cy); } 函数时这样写的: void CMy1Dlg::Resize(int x,int y) { CRect OldRect; GetDlgItem(IDC_LOADZB)-GetClientRect(OldRect); } 然后因为Onsize()是在窗口大小更改时调用的, Onsize 函数是在OnInitDialog 之前调用的,但是在Onsize 函数中却又未判断地调用了对话框的子控件 GetDlgItem(IDC_LOADZB)-GetClientRect(OldRect); 于是出现异常 解决:设置判断变量IsDialog,初始化为FALSE,然后在OnSize()中判断,如果已经调用了OnInitDialog() 则执行,(在对子控件有操作的情况下)在调用完OnInitDialog 的时候设置IsDialog 为TRUE 即可。 分析: 跟踪到基类的CDialog::OnInitDialog(); 以为是基类中的ExecuteDlgInit ()函数起的作用, ExecuteDlgInit ()的函数作用: 启动对话框资源 备注: ExecuteDlgInit 将使用其他源中的资源绑定到执行模块或资源 然后在CDialog::OnInitDialog()之前调用了子控件 BOOL CMy1Dlg::OnInitDialog() { CRect CPrect; GetDlgItem(IDC_LOADZB)-GetClientRect(CPrect); CDialog::OnInitDialog(); } 结果却没有异常,这说明不是CDialog::OnInitDialog()中的函数的作用... 然后在Resize 中测试,即Onsize()的调用函数中进行判断是否含有其窗口句柄(至于为什么判断句柄是因 为在调用GetClientRect 的时候调用的是::GetClientRect(m_hWnd, lpRect);) 然后用IsWindow(HWND hWnd)来判断发现只要有引用到这个句柄的地方就会出错。。如 HWND hwnd=GetDlgItem(IDC_LOADZB)-m_hWnd;就会调用到OnInitDialog(),而 (IDC_LOADZB)-m_hWndd 只是调用放回值错,但是不调用OnInitDialog() 。 WM_INITDIALOG 消息响应函数是在程序运行时,当其对话框和子控件全部创建完毕,将要显示内容的时 候发送的消息。因此可以在WM_INITDIALOG 消息响应函数中添加对编辑框控件的初始化和修改。 CWnd* CWnd::GetDlgItem(int nID) const { ASSERT(::IsWindow(m_hWnd)); if (m_pCtrlCont == NULL) return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID)); //进入了这个函数 else return m_pCtrlCont-GetDlgItem(nID); } CWnd* PASCAL CWnd::FromHandle(HWND hWnd) //如果还未调用OnInitDialog 之前这个hWnd 是空的, 而调用在刚刚调用OnInitDialog 函数中调用的hWnd 不是空的,那么只能是在OnInitDialog 之前但在Onsize 之后调用的函数来决定了。 {

文档评论(0)

jgx3536 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档