2009-10-01 13 views
12

Według msdn, kiedy dostaję cwnd * Z cwnd :: FromHandle,Jaki jest czas życia CWnd uzyskanego z CWnd :: FromHandle?

Wskaźnik może mieć charakter tymczasowy i nie powinny być przechowywane do późniejszego wykorzystania.

Co oznacza "późniejsze użycie", nie jest dla mnie jasne. Czy to tylko zakres obecnej metody? O ile mi wiadomo, nie ma GC w Win32!

Odpowiedz

15

MFC utrzymuje wiele map uchwytów, od HWND do CWnd, HDC do CDC itp., Które są przechowywane w stanie gwintu. Każda mapa uchwytów zawiera stałą mapę i tymczasową mapę - stałe wpisy są dodawane po wywołaniu metody, takiej jak CWnd :: Create lub CDC :: Attach, podczas gdy tymczasowe wpisy są tworzone po wywołaniu FromHandle na uchwycie, który nie ma stałe wejście.

Tymczasowe wpisy są czyszczone podczas przetwarzania w trybie bezczynności (w CWinApp :: OnIdle), więc można je bezpiecznie używać tylko podczas przetwarzania bieżącej wiadomości. Zaraz po powrocie do pętli wiadomości lub wprowadzeniu innej pętli modalnej (np. Przez wywołanie DoModal), mogą one zostać usunięte.

+0

Czy to oznacza, że ​​możesz pobrać HWND z (prawdopodobnie tymczasowego) CWnd i zapisać to? Następnie, w razie potrzeby, możesz zadzwonić do FromHandle za pomocą zapisanego HWND, aby uzyskać CWnd. – Steg

+2

Tak, to byłoby w porządku, HWND będzie obowiązywał przez cały okres istnienia okna. –

+0

Doskonałe, okrzyki Phil – Steg

0

W oparciu o ten sam opis MSDN, zakładam, że oznacza to, że jeśli do obiektu hWnd podanego jako obiekt nie zostanie dołączony żaden plik CWnd, zostanie utworzony tymczasowy plik CWnd, który prawdopodobnie zostanie zniszczony, gdy coś wykracza poza zakres, lub destruktor gdzie indziej jest wywołany lub CWnd jest jawnie stworzony dla hWnd, o którym mowa. Jeśli masz już stworzony plik CWnd, powinieneś być w porządku, w przeciwnym razie prawdopodobnie będziesz musiał zachować ostrożność podczas przechowywania wskazanego wskaźnika.

0

Zazwyczaj chcą tylko, aby używać tego uchwytu w zakresie swojej funkcji. I nie przechowywać go jako pola klasowego, do którego odwołujesz się przez całe życie swojego obiektu.

+0

Nie tak wiele funkcji jak podczas przetwarzania tej samej wiadomości, jak sądzę. – EFraim

1

FromHandle służy zasadniczo do uzyskania przejściowego odniesienia do już istniejącego obiektu okna. MFC przechowuje te referencje w wewnętrznej strukturze nazywanej tymczasową mapą uchwytów (mapa uchwytu to mapa obiektów HWND systemu Windows na obiekty MWW CWnd używane przez MFC do wywoływania wywołań systemu Win32 w celu manipulowania rzeczywistym oknem systemu Windows, do którego odnosi się obiekt MFC). Aby uniknąć wzrostu liczby obiektów w tej strukturze poza wszelkimi granicami, elementy są usuwane z mapy uchwytów podczas przetwarzania w pętli bezczynności MFC.

Jak można się domyślić, istnieje również mapa z uchwytem, ​​która nie będzie miała automatycznego czyszczenia. Jeśli potrzebujesz obiektu CWnd, który nie umieści swojego odwołania HWND w tymczasowej mapie uchwytów, możesz wywołać FromHandlePermanent().

-Ron

Powiązane problemy