根据msdn的说法,当我用CWnd::FromHandle获得CWnd*时,
指针可能是临时的,不应该存储以供以后使用。
“以后使用”是什么意思,我不太清楚。这仅仅是当前方法的范围吗?据我所知,Win32中没有GC!
发布于 2009-10-01 15:26:48
MFC维护许多句柄映射,从HWND到CWnd、HDC到CDC等等,这些映射都存储在线程状态中。每个句柄映射都包含一个永久映射和临时映射--在调用CWnd::Create或CDC::Attach之类的方法时添加临时条目,而在对没有永久条目的句柄调用FromHandle时创建临时条目。
临时条目在空闲处理期间被清除(在CWinApp::OnIdle中),因此它们只能在处理当前消息时安全地使用。一旦您返回到消息循环,或者进入另一个模式循环(例如,通过调用DoModal),它们就可能被删除。
发布于 2009-10-01 15:31:35
FromHandle基本上用于获取对已经存在的窗口对象的瞬态引用。MFC将这些引用存储在称为临时句柄映射的内部结构中(句柄映射是Windows到MFC CWnd对象的映射,用于进行Win32调用以操作MFC对象对应的实际Windows窗口)。为了避免该结构中的对象数量超出所有界限,在MFC的空闲循环处理过程中,将从句柄映射中删除项。
正如您可能已经猜到的,还有一个永久的句柄映射不会有这种自动清理行为。如果您需要获得一个没有将其HWND引用放在临时句柄映射中的CWnd对象,则可以调用FromHandlePermanent()。
-Ron
发布于 2009-10-01 15:08:06
基于相同的MSDN描述,我假设这意味着如果没有将CWnd附加到作为对象提供的hWnd上,它将创建一个临时CWnd,该临时CWnd可能会在某物超出作用域时被销毁,或者调用其他地方的析构函数,或者显式地为所述hWnd创建CWnd。因此,如果您已经创建了一个CWnd,您应该没事,否则您可能需要非常小心地存储您收到的指针。
https://stackoverflow.com/questions/1504507
复制相似问题