首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从CWnd::FromHandle获得的CWnd的生存期是多少?

从CWnd::FromHandle获得的CWnd的生存期是多少?
EN

Stack Overflow用户
提问于 2009-10-01 15:05:12
回答 4查看 4K关注 0票数 13

根据msdn的说法,当我用CWnd::FromHandle获得CWnd*时,

指针可能是临时的,不应该存储以供以后使用。

“以后使用”是什么意思,我不太清楚。这仅仅是当前方法的范围吗?据我所知,Win32中没有GC!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-10-01 15:26:48

MFC维护许多句柄映射,从HWND到CWnd、HDC到CDC等等,这些映射都存储在线程状态中。每个句柄映射都包含一个永久映射和临时映射--在调用CWnd::Create或CDC::Attach之类的方法时添加临时条目,而在对没有永久条目的句柄调用FromHandle时创建临时条目。

临时条目在空闲处理期间被清除(在CWinApp::OnIdle中),因此它们只能在处理当前消息时安全地使用。一旦您返回到消息循环,或者进入另一个模式循环(例如,通过调用DoModal),它们就可能被删除。

票数 17
EN

Stack Overflow用户

发布于 2009-10-01 15:31:35

FromHandle基本上用于获取对已经存在的窗口对象的瞬态引用。MFC将这些引用存储在称为临时句柄映射的内部结构中(句柄映射是Windows到MFC CWnd对象的映射,用于进行Win32调用以操作MFC对象对应的实际Windows窗口)。为了避免该结构中的对象数量超出所有界限,在MFC的空闲循环处理过程中,将从句柄映射中删除项。

正如您可能已经猜到的,还有一个永久的句柄映射不会有这种自动清理行为。如果您需要获得一个没有将其HWND引用放在临时句柄映射中的CWnd对象,则可以调用FromHandlePermanent()。

-Ron

票数 1
EN

Stack Overflow用户

发布于 2009-10-01 15:08:06

基于相同的MSDN描述,我假设这意味着如果没有将CWnd附加到作为对象提供的hWnd上,它将创建一个临时CWnd,该临时CWnd可能会在某物超出作用域时被销毁,或者调用其他地方的析构函数,或者显式地为所述hWnd创建CWnd。因此,如果您已经创建了一个CWnd,您应该没事,否则您可能需要非常小心地存储您收到的指针。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1504507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档