13

msdnによると、CWnd::FromHandle で CWnd* を取得すると、

ポインターは一時的なものである可能性があり、後で使用するために保存しないでください。

「後で使用する」の意味がわかりません。それは現在の方法の範囲だけですか?私の知る限り、Win32 には GC がありません!

4

4 に答える 4

17

MFC は、HWND から CWnd、HDC から CDC など、スレッド状態に格納される多数のハンドル マップを維持します。各ハンドル マップには、永続マップと一時マップが含まれています。永続エントリは、CWnd::Create や CDC::Attach などのメソッドを呼び出すと追加されますが、一時エントリは、ハンドルを持たないハンドルで FromHandle を呼び出すと作成されます。永久エントリー。

一時エントリは、(CWinApp::OnIdle での) アイドル処理中にクリーンアップされるため、現在のメッセージの処理中にのみ安全に使用できます。メッセージ ループに戻るか、別のモーダル ループ (DoModal の呼び出しなど) に入るとすぐに、それらは削除される可能性があります。

于 2009-10-01T15:26:48.473 に答える
1

FromHandleは基本的に、既存のウィンドウオブジェクトへの一時的な参照を取得するために使用されます。MFCは、これらの参照を一時ハンドルマップと呼ばれる内部構造に格納します(ハンドルマップは、MFCオブジェクトが対応する実際のWindowsウィンドウを操作するためにWin32呼び出しを行うためにMFCによって使用されるMFCCWndオブジェクトへのWindowsHWNDのマップです)。この構造内のオブジェクトの数がすべての境界を超えて増加するのを防ぐために、アイテムはMFCのアイドルループ処理中にハンドルマップから削除されます。

ご想像のとおり、この自動クリーンアップ動作を持たない永続的なハンドルマップもあります。HWND参照を一時ハンドルマップに配置しないCWndオブジェクトを取得する必要がある場合は、FromHandlePermanent()を呼び出すことができます。

-ロン

于 2009-10-01T15:31:35.457 に答える
0

通常、関数のスコープ内でのみこのハンドルを使用することを望んでいます。また、オブジェクトの存続期間を通じて参照するクラス フィールドとして格納しないでください。

于 2009-10-01T15:10:17.847 に答える
0

同じ MSDN の説明に基づいて、これは、オブジェクトとして提供された hWnd に CWnd がアタッチされていない場合、一時的な CWnd が作成され、何かがスコープ外になるか、他の場所でデストラクタが呼び出されるとおそらく破棄されることを意味すると思います。 、または問題の hWnd に対して CWnd が明示的に作成されます。したがって、すでに CWnd を作成している場合は問題ありませんが、そうでない場合は、受け取ったポインターを保存する際に非常に注意する必要があります。

于 2009-10-01T15:08:06.070 に答える