从CWnd :: FromHandle获得的CWnd的生命周期是多少?

时间:2009-10-01 15:05:12

标签: mfc winapi hwnd cwnd

根据msdn,当我使用CWnd :: FromHandle获得CWnd *时,

  

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

“后期使用”的含义对我来说并不清楚。它只是当前方法的范围吗? 据我所知,Win32中没有GC!

4 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:1)

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

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

-Ron

答案 2 :(得分:0)

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

答案 3 :(得分:0)

通常,他们只希望您在函数范围内使用此句柄。而不是将它存储为一个类字段,你可以在它的整个生命周期中引用它。