根据MSDN ,当我得到一个CWnd *中有CWnd :: FromHandle,
指针可能是临时的,不应该被存储供以后使用。
什么是“后用”的意思是,我不清楚。 难道仅仅是当前方法的范围是什么? 据我所知,目前在Win32中没有GC!
根据MSDN ,当我得到一个CWnd *中有CWnd :: FromHandle,
指针可能是临时的,不应该被存储供以后使用。
什么是“后用”的意思是,我不清楚。 难道仅仅是当前方法的范围是什么? 据我所知,目前在Win32中没有GC!
MFC维护了大量的句柄映射的,从HWND到CWnd的,HDC疾病预防控制中心等,它们存储在线程状态。 每个手柄地图包含永久性的地图和临时地图 - 当你调用一个方法,如CWnd的永久条目添加:创建或CDC ::连接,同时创建临时条目,当你调用FromHandle上的手柄没有永久条目。
空闲处理(在的CWinApp ::的OnIdle)期间临时条目被清理,所以在处理当前消息只能安全地使用。 当您返回到消息循环,或进入另一个模式循环(例如,通过调用的DoModal),那么他们可能会被删除。
FromHandle基本上是用于得到一个瞬时参考到已经存在的窗口对象。 MFC存储在内部结构这些引用称为临时句柄映射(手柄地图的Windows HWNDs的地图来使用MFC使Win32调用来操作MFC对象对应于实际的Windows窗口MFC的CWnd对象)。 为了避免在这个结构中的对象的数量从增长超越了所有界限,项目从MFC的空闲循环处理过程中把手地图中删除。
正如你可能已经猜到了,也不会有这种自动清理行为永久句柄映射。 如果你需要得到一个CWnd对象,不把它的HWND参考在临时处理地图,你可以调用FromHandlePermanent()。
-Ron
基于同样的MSDN的描述,我会假设,这意味着,如果没有的CWnd连接到的hWnd为对象提供的,它会一次东西超出范围创造出可能被摧毁了一个临时的CWnd或析构函数在其他地方被称为或一个CWnd为的hWnd的问题是明确创建。 所以,如果你已经有了一个CWnd创建的,你应该确定,否则你可能会需要非常小心存放您收到的指针。
通常,他们只希望你在你的函数的范围内使用该手柄。 而不是将其存储为在那里你引用它通过你的对象的生命周期类字段。