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

Mfc 从CWnd::FromHandle获得的CWnd的生存期是多少?,mfc,winapi,hwnd,cwnd,Mfc,Winapi,Hwnd,Cwnd,根据,当我得到一个带有CWnd::FromHandle的CWnd*时 指针可能是临时的,不应存储以供以后使用 我不清楚“以后使用”是什么意思。这只是当前方法的范围吗? 据我所知,Win32中没有GC 基于相同的MSDN描述,我假设这意味着如果没有CWnd附加到作为对象提供的hWnd,它将创建一个临时CWnd,一旦某个内容超出范围,或者调用其他地方的析构函数,或者显式为相关hWnd创建CWnd,该CWnd可能会被销毁。因此,如果已经创建了CWnd,则应该可以,否则在存储收到的指针时可能需要非常小心

根据,当我得到一个带有CWnd::FromHandle的CWnd*时

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

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

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

通常,他们只希望您在函数范围内使用此句柄。不要将其存储为类字段,在对象的整个生命周期中引用它。

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


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

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

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


-Ron

我想,它的功能范围不如处理同一条消息时的功能范围大。这是否意味着您可以从(可能是临时的)CWnd获取HWND并将其存储?然后,在以后需要时,您可以使用存储的HWND调用FromHandle以获取CWnd。是的,那很好,HWND将在窗口的生存期内有效。