• 太原市第六届半程马拉松赛开赛 2019-04-26
  • 《布尔塞维克》编辑部故事 2019-04-21
  • 候选企业:拜耳医药保健有限公司 2019-04-20
  • 守住青山不放松 护好绿水不辞难——在渝全国人大代表聚焦“共抓大保护、不搞大开发”专题调研记略 2019-04-20
  • 去这6个城市旅游 飞机高铁随便选 2019-04-15
  • 地理君的专栏作者中国国家地理网 2019-04-15
  • 国安中卫位置最佳引援浮现 能攻善守已成当红国脚 2019-04-08
  • 梁衡.blog的博客—强国博客—人民网 2019-04-08
  • 习近平新时代中国特色社会主义经济思想的丰富内涵和历史基础 2019-04-06
  • 微信群,让人又爱又恨 2019-04-06
  • 头皮出油头屑严重 该怎么养发护发?-美食资讯 2019-04-04
  • 狗屁不通!知道你的貴村長姓啥嗎? 2019-04-03
  • 外媒称中俄合作攸关世界秩序 两国间很难被“插入楔子” 2019-04-03
  • 重庆社保缴费基数新调整 医保养老金等待遇提高 2019-03-31
  • [大笑]那依然是按劳(劳动价值或劳动能力)分配也! 2019-03-31
  • 分享到:文章主题: MFC中CWnd::GetDlgItem()的坑
    bn95楼主
    本能
    身份
    用户
    文章
    366
    星座
    水瓶座
    积分
    26664
    等级
    灌木(4)

    发信人: bn95 (本能), 信区: Programming
    标  题: MFC中CWnd::GetDlgItem()的坑
    发信站: 水木社区 (Fri Nov 16 09:57:46 2018), 站内
      
    CString str;
    CWnd* pWnd;
    pWnd = GetDlgItem(IDC_STATIC_INFO);
    pWnd->GetWindowText(str);
    这样的代码是不合规范而且是危险的,可能导致程序崩溃。如果你这么做没遇到崩溃是你的程序的运气。
    因为:
      
    CWnd::GetDlgItem  
    CWnd* GetDlgItem( int nID ) const;
      
    void CWnd::GetDlgItem( int nID, HWND* phWnd ) const;
      
    Return Value
      
    A pointer to the given control or child window. If no control with the integer ID given by the nID parameter exists, the value is NULL.  
      
    The returned pointer may be temporary and should not be stored for later use.
      
    --
    ※ 修改:·bn95 于 Nov 16 09:58:32 2018 修改本文·[FROM: 183.134.62.*]
    ※ 来源:·水木社区 //www.lmfr.net·[FROM: 183.134.62.*]

    返回顶部
    xiaoju第1楼
    可爱的龙猫
    身份
    用户
    文章
    95056
    积分
    49042
    等级
    斗拱(14)

    河北快三开奖结果 www.lmfr.net 发信人: xiaoju (可爱的龙猫), 信区: Programming
    标  题: Re: MFC中CWnd::GetDlgItem()的坑
    发信站: 水木社区 (Fri Nov 16 10:36:37 2018), 站内
      
    这个用法是没有问题的,你没看懂帮助说的到底是什么。程序如果真崩了是因为你的IDC_STATIC_INFO不存在。
      
    MSDN自己例子就是这么用的:
    https://msdn.microsoft.com/en-us/library/1xb05f0h.aspx#cwnd__getdlgitem
      
        // uses GetDlgItem to return a pointer to a user interface control
        CEdit* pBoxOne;
        pBoxOne = (CEdit*)GetDlgItem(IDC_MYEDIT);
        GotoDlgCtrl(pBoxOne);
      
      
    【 在 bn95 (本能) 的大作中提到: 】
    : 标  题: MFC中CWnd::GetDlgItem()的坑
    : 发信站: 水木社区 (Fri Nov 16 09:57:46 2018), 站内
    :  
    : CString str;
    : CWnd* pWnd;
    : pWnd = GetDlgItem(IDC_STATIC_INFO);
    : pWnd->GetWindowText(str);
    : 这样的代码是不合规范而且是危险的,可能导致程序崩溃。如果你这么做没遇到崩溃是你的程序的运气。
    : 因为:
    :  
    : CWnd::GetDlgItem  
    : CWnd* GetDlgItem( int nID ) const;
    :  
    : void CWnd::GetDlgItem( int nID, HWND* phWnd ) const;
    :  
    : Return Value
    :  
    : A pointer to the given control or child window. If no control with the integer ID given by the nID parameter exists, the value is NULL.  
    :  
    : The returned pointer may be temporary and should not be stored for later use.
    :  
    : --
    : ※ 修改:·bn95 于 Nov 16 09:58:32 2018 修改本文·[FROM: 183.134.62.*]
    : ※ 来源:·水木社区 //www.lmfr.net·[FROM: 183.134.62.*]
      
      
    --
      
    ※ 来源:·水木社区 www.lmfr.net·[FROM: 113.29.7.*]

    返回顶部
    bn95第2楼
    本能
    身份
    用户
    文章
    366
    星座
    水瓶座
    积分
    26664
    等级
    灌木(4)

    发信人: bn95 (本能), 信区: Programming
    标  题: Re: MFC中CWnd::GetDlgItem()的坑
    发信站: 水木社区 (Fri Nov 16 15:17:41 2018), 站内
      
    微软不是神,微软花了几十年改bug,bug依然越来越多。
      
      CEdit* pBoxOne;  
      pBoxOne = (CEdit*)GetDlgItem(IDC_MYEDIT);  
      dosomething();//如果这里花了几秒钟时间去干其他活呢????程序将会不可预知。虽然大部分时间和系统上没事,但有时会出事。因为微软MFC专门有一个线程在空闲时间去释放这些GetDlgItem返回的指针对象。
      GotoDlgCtrl(pBoxOne);  
        
    这是我数天排查一个bug进行地毯式打印log和看mfc代码得出来的教训。
    IDC_STATIC_INFO不可能消失,因为就是一个对话框程序而已,对话框不会消失。
    GetDlgItem的返回也是对的,立即进行指针操作也是对的。但是过一点时间再操作就不可预知了。
      
    有代码洁癖的我自此以后再也不用GetDlgItem返回对象指针了,而是直接用api返回窗口句柄保存起来:
    HWND GetDlgItem(  HWND hDlg,       // handle to dialog box
       int nIDDlgItem   // control identifier);
      
    【 在 xiaoju 的大作中提到: 】
    : 这个用法是没有问题的,你没看懂帮助说的到底是什么。程序如果真崩了是因为你的IDC_STATIC_INFO不存在。
    : MSDN自己例子就是这么用的:
    : https://msdn.microsoft.com/en-us/library/1xb05f0h.aspx#cwnd__getdlgitem
    : ...................
      
    --
    ※ 修改:·bn95 于 Nov 16 15:33:06 2018 修改本文·[FROM: 183.134.62.*]
    ※ 来源:·水木社区 //www.lmfr.net·[FROM: 183.134.62.*]

    返回顶部
    dormouseBHU第3楼
    dormouseBHU
    身份
    版主
    文章
    4334
    星座
    金牛座
    积分
    52818
    等级
    楠木(12)

    发信人: dormouseBHU (dormouseBHU), 信区: Programming
    标  题: Re: MFC中CWnd::GetDlgItem()的坑
    发信站: 水木社区 (Fri Nov 16 17:25:08 2018), 站内
      
    MFC哪个线程是用来清理这个的?
    我好歹也玩过几年逆向工程,从来没发现MFC有你说的这个线程…
    【 在 bn95 的大作中提到: 】
    : 微软不是神,微软花了几十年改bug,bug依然越来越多。
    :  CEdit* pBoxOne;  
    :  pBoxOne = (CEdit*)GetDlgItem(IDC_MYEDIT);  
    : ...................
    --
      
    ※ 来源:·水木社区 //m.www.lmfr.net·[FROM: 223.104.3.*]

    返回顶部
    xiaoju第4楼
    可爱的龙猫
    身份
    用户
    文章
    95056
    积分
    49042
    等级
    斗拱(14)

    发信人: xiaoju (可爱的龙猫), 信区: Programming
    标  题: Re: MFC中CWnd::GetDlgItem()的坑
    发信站: 水木社区 (Fri Nov 16 18:14:36 2018), 站内
      
    倒,MFC这种老古董你玩出垃圾回收了
      
    【 在 bn95 (本能) 的大作中提到: 】
    : 微软不是神,微软花了几十年改bug,bug依然越来越多。
    :  CEdit* pBoxOne;  
    :  pBoxOne = (CEdit*)GetDlgItem(IDC_MYEDIT);  
    : ...................
      
    --
      
    ※ 来源:·水木社区 www.lmfr.net·[FROM: 27.91.71.*]

    返回顶部
    tazz第5楼
    速度复合弓
    身份
    用户
    文章
    9485
    星座
    水瓶座
    积分
    31804
    等级
    灵樨(8)

    发信人: tazz (速度复合弓), 信区: Programming
    标  题: Re: MFC中CWnd::GetDlgItem()的坑
    发信站: 水木社区 (Fri Nov 16 18:37:39 2018), 站内
      
    哇,好久没见到mfc代码了。
    因为都在一个线程里,所以没问题的。
      
    【 在 bn95 的大作中提到: 】
    : CString str;
    : CWnd* pWnd;
    : pWnd = GetDlgItem(IDC_STATIC_INFO);
    : ...................
    --
      
    ※ 来源:·水木社区 //m.www.lmfr.net·[FROM: 61.151.178.*]

    返回顶部
    xiaoju第6楼
    可爱的龙猫
    身份
    用户
    文章
    95056
    积分
    49042
    等级
    斗拱(14)

    发信人: xiaoju (可爱的龙猫), 信区: Programming
    标  题: Re: MFC中CWnd::GetDlgItem()的坑
    发信站: 水木社区 (Fri Nov 16 18:42:52 2018), 站内
      
    楼主大概率自己开了个线程把UI线程的东西给释放了
      
    新手一般对指针和线程的使用非常大胆,所以python既没指针也不支持多线程。MFC设计的时候,既没有C++11的std::thread和capture,又没有ATL这种简易封装库,想把多线程写对很不容易
      
    【 在 tazz (速度复合弓) 的大作中提到: 】
    : 哇,好久没见到mfc代码了。
    : 因为都在一个线程里,所以没问题的。
      
      
    --
      
    ※ 来源:·水木社区 www.lmfr.net·[FROM: 27.91.71.*]

    返回顶部
    bn95第7楼
    本能
    身份
    用户
    文章
    366
    星座
    水瓶座
    积分
    26664
    等级
    灌木(4)

    发信人: bn95 (本能), 信区: Programming
    标  题: Re: MFC中CWnd::GetDlgItem()的坑
    发信站: 水木社区 (Sat Nov 17 01:53:58 2018), 站内
      
    我经历过这种灾难
    https://blog.csdn.net/mood8125/article/details/1113341
      
    【 在 dormouseBHU 的大作中提到: 】
    : MFC哪个线程是用来清理这个的?
    : 我好歹也玩过几年逆向工程,从来没发现MFC有你说的这个线程…
      
    --
      
    ※ 来源:·水木社区 //www.lmfr.net·[FROM: 183.134.62.*]

    返回顶部
    dormouseBHU第8楼
    dormouseBHU
    身份
    版主
    文章
    4334
    星座
    金牛座
    积分
    52818
    等级
    楠木(12)

    发信人: dormouseBHU (dormouseBHU), 信区: Programming
    标  题: Re: MFC中CWnd::GetDlgItem()的坑
    发信站: 水木社区 (Sat Nov 17 08:31:48 2018), 站内
      
    OnIdle() 的作用就是释放临时资源,你没搞懂onidle的作用就乱用,这个锅mfc不能背。
    【 在 bn95 的大作中提到: 】
    : 我经历过这种灾难
    : https://blog.csdn.net/mood8125/article/details/1113341
    :
    --
      
    ※ 来源:·水木社区 //m.www.lmfr.net·[FROM: 223.72.78.*]

    返回顶部
    bn95第9楼
    本能
    身份
    用户
    文章
    366
    星座
    水瓶座
    积分
    26664
    等级
    灌木(4)

    发信人: bn95 (本能), 信区: Programming
    标  题: Re: MFC中CWnd::GetDlgItem()的坑
    发信站: 水木社区 (Sat Nov 17 09:18:44 2018), 站内
      
    我又没用OnIdle() ,OnIdle() 不是系统自动运行的?
    【 在 dormouseBHU 的大作中提到: 】
    : OnIdle() 的作用就是释放临时资源,你没搞懂onidle的作用就乱用,这个锅mfc不能背。
    : :
      
    --
    ※ 修改:·bn95 于 Nov 17 09:19:15 2018 修改本文·[FROM: 223.72.82.*]
    ※ 来源:·水木社区 //www.lmfr.net·[FROM: 223.72.82.*]

    返回顶部
  • 太原市第六届半程马拉松赛开赛 2019-04-26
  • 《布尔塞维克》编辑部故事 2019-04-21
  • 候选企业:拜耳医药保健有限公司 2019-04-20
  • 守住青山不放松 护好绿水不辞难——在渝全国人大代表聚焦“共抓大保护、不搞大开发”专题调研记略 2019-04-20
  • 去这6个城市旅游 飞机高铁随便选 2019-04-15
  • 地理君的专栏作者中国国家地理网 2019-04-15
  • 国安中卫位置最佳引援浮现 能攻善守已成当红国脚 2019-04-08
  • 梁衡.blog的博客—强国博客—人民网 2019-04-08
  • 习近平新时代中国特色社会主义经济思想的丰富内涵和历史基础 2019-04-06
  • 微信群,让人又爱又恨 2019-04-06
  • 头皮出油头屑严重 该怎么养发护发?-美食资讯 2019-04-04
  • 狗屁不通!知道你的貴村長姓啥嗎? 2019-04-03
  • 外媒称中俄合作攸关世界秩序 两国间很难被“插入楔子” 2019-04-03
  • 重庆社保缴费基数新调整 医保养老金等待遇提高 2019-03-31
  • [大笑]那依然是按劳(劳动价值或劳动能力)分配也! 2019-03-31