zoukankan      html  css  js  c++  java
  • 【VS开发】list控件的InsertColumn方法出错

    今天在写一个获取磁盘信息的小程序,通过list控件显示各磁盘信息。我在属性页(CPropertyPage)的构造函数中,调用list控件的InsertColumn方法,编译链接都通过了,但运行时冒出了一个Debug Assertion Failed!提示

     

     

     

    我就改用调试方式运行,再弹出该对话框时,选择重试,最后程序中断指向了

    _AFXCMN_INLINE int CListCtrl::InsertColumn(int nCol, const LVCOLUMN* pColumn)
     { ASSERT(::IsWindow(m_hWnd)); return (int) ::SendMessage(m_hWnd, LVM_INSERTCOLUMN, nCol, (LPARAM)pColumn); }

    其中,m_hWnd为0x00000000

    监视(watch)窗口的 @err,hr(即,GetLastError)为

     @err,hr 0x00000578 无效的窗口句柄。  unsigned long

     

    起初,我没在意m_hWnd和@err,hr的值,只是看到出错点是CListCtrl::InsertColumn就上网查。不过网上有关调用CListCtrl::InsertColumn出错的文章很少!但有个帖子模模糊糊提到了可能是窗体类还没创建引起的错误。后来我再用调试运行执行程序,执行来到刚刚出错的地方,发现SendMessage的m_hWnd为0x00000000,说明此时list控件还没有创建。

    我是在属性页(CPropertyPage)的构造函数中调用InsertColumn的,CPropertyPage为窗体,继承于CDialog。程序执行到CPropertyPage构造函数时,属性页还没创建完成,其中的控件也还没创建完成,在调用InsertColumn时,向list控件发送一个LVM_INSERTCOLUMN消息,但由于list控件还没有创建,才会引起无效的窗口句柄错误!将InsertColumn方法放在CPropertyPage::OnInitDialog()中调用,问题就解决了!

     

    要是刚开始我注意了m_hWnd或 @err,hr的值,问题很快就能解决!看来要好好改改思维习惯了

     

    @err,hr是我从《Windows核心编程》学到的一个技巧,它的功能等同于GetLastError,但使用起来比GetLastError方便多了!只要程序调试时在监视(watch)窗口,加上一项@err,hr,就能查看到每一步调试运行时的Error Code,并且有对Error Code的文本描述。而不需要在程序中加入GetLastError代码来获取Error Code,再用Error Lookup工具将Error Code转换成相应的文本描述!不过@err,hr不是每个IDE都支持的,我试过vc++6.0 sp6用不了,vs2005就可以!

  • 相关阅读:
    潘石屹出售上海外滩金融中心股权 4年没新增投资
    【BZOJ4036】【洛谷3175】【HAOI2015】—按位或(FMT+期望dp)
    信托配资清理“逃生通道”隐情
    中国在移动端的营销水平已超国外
    “土豪”们的新人生模型
    苏宁的逆市“O2O进化论”
    信汇中正领导力打造“必读12篇”之路
    你是否真的需要说声“谢谢”?
    新主管如何快速上手
    雷军和黄章又掐架了 不就是“不服跑个分”嘛
  • 原文地址:https://www.cnblogs.com/huty/p/8518688.html
Copyright © 2011-2022 走看看