分享到:文章主题: MFC中CWnd::GetDlgItem()的坑
bn95楼主
本能
身份
用户
文章
243
星座
水瓶座
积分
25302
等级
灌木(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楼
可爱的龙猫
身份
用户
文章
92170
积分
50104
等级
椽桷(13)

河北快三开奖结果 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楼
本能
身份
用户
文章
243
星座
水瓶座
积分
25302
等级
灌木(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
身份
版主
文章
4253
星座
金牛座
积分
50425
等级
楠木(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楼
可爱的龙猫
身份
用户
文章
92170
积分
50104
等级
椽桷(13)

发信人: 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楼
速度复合弓
身份
用户
文章
8391
星座
水瓶座
积分
29652
等级
灵樨(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楼
可爱的龙猫
身份
用户
文章
92170
积分
50104
等级
椽桷(13)

发信人: 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楼
本能
身份
用户
文章
243
星座
水瓶座
积分
25302
等级
灌木(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
身份
版主
文章
4253
星座
金牛座
积分
50425
等级
楠木(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楼
本能
身份
用户
文章
243
星座
水瓶座
积分
25302
等级
灌木(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.*]

返回顶部