13

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

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

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

4

4 回答 4

17

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

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

于 2009-10-01T15:26:48.473 回答
1

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

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

-罗恩

于 2009-10-01T15:31:35.457 回答
0

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

于 2009-10-01T15:08:06.070 回答
0

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

于 2009-10-01T15:10:17.847 回答