根据 msdn,使用CWnd::FromHandle获取CWnd*时,
“日后使用” 是什么意思并不清楚。它只限于当前方法的范围吗?据我所知,Win32中没有GC!该指针可能是临时的,不应该被存储以供日后使用。
MFC维护了许多句柄映射,例如从HWND到CWnd,HDC到CDC等,它们存储在线程状态中。每个句柄映射都包含一个永久映射和临时映射 - 当您调用CWnd::Create或CDC::Attach等方法时会添加永久条目,而当您在没有永久条目的句柄上调用FromHandle时,则会创建临时条目。
临时条目在空闲处理期间(在CWinApp :: OnIdle中)进行清理,因此只能在处理当前消息时安全使用。一旦返回到消息循环或进入另一个模态循环(例如通过调用DoModal),则它们可能会被删除。
FromHandle基本上用于获取已存在的窗口对象的瞬态引用。MFC将这些引用存储在一个名为临时句柄映射的内部结构中(句柄映射是Windows HWND到MFC CWnd对象的映射,由MFC用于进行Win32调用以操作与MFC对象对应的实际Windows窗口)。为了避免该结构中的对象数量超出所有限制,MFC在空闲循环处理期间从句柄映射中删除项目。
正如您可能已经猜到的那样,还有一个永久句柄映射,它不会具有此自动清理行为。如果您需要获取不将其HWND引用放入临时句柄映射中的CWnd对象,则可以调用FromHandlePermanent()。
-Ron