Frage

Nach Msdn , wenn ich erhalten ein CWnd * mit CWnd :: Fromhandle,

  

Der Zeiger kann vorübergehend sein und soll nicht für eine spätere Verwendung gespeichert werden.

Was versteht man unter „später verwenden“ ist mir nicht klar. Ist es nur der Umfang der aktuellen Methode? Soweit ich weiß, gibt es keine GC in Win32!

War es hilfreich?

Lösung

MFC verwaltet eine Anzahl von Griff Karten, von HWND zu CWnd, HDC CDC usw., die in dem Thread-Zustand gespeichert sind. Jeder Griff Karte enthält eine permanente Karte und temporäre Karte - permanente Einträge werden hinzugefügt, wenn Sie eine Methode wie CWnd aufrufen :: Create oder CDC :: Attach, während temporäre Einträge erstellt werden, wenn Sie Fromhandle auf einem Griff nennen, der kein hat Dauer Eintrag.

Temporäre Einträge werden während der Leerlaufverarbeitung (in CWinApp :: OnIdle) gereinigt, so dass sie nur sicher verwendet werden, während die aktuelle Nachricht zu verarbeiten. Sobald Sie in die Nachrichtenschleife zurückzukehren oder einen anderen modalen Schleife eingeben (zum Beispiel durch DoModal aufrufen), dann können sie gelöscht werden.

Andere Tipps

wird Fromhandle für die Zeugung eines transienten Verweis auf ein bereits vorhandenes Fenster Objekt grundsätzlich verwendet. MFC speichert diese Referenzen in einer internen Struktur namens eine temporäre Griff Karte (eine Handle Karte eine Karte von Windows HWNDs zu MFC CWnd Objekten von MFC verwendet ist, um Win32 ruft die aktuellen Windows-Fenster das MFC-Objekt entspricht zu manipulieren). Um die Anzahl der Objekte in dieser Struktur wachsen über alle Grenzen zu vermeiden, werden Elemente aus dem Griff der Karte während der MFC-Warteschleife der Verarbeitung gelöscht.

Wie Sie vielleicht schon erraten haben, gibt es auch eine permanente Griff Karte, die diese automatische Bereinigung Verhalten nicht haben. Wenn Sie ein CWnd-Objekt zu erhalten, die nicht seine HWND Referenz im temporären Griff Karte nicht setzen Sie FromHandlePermanent () aufrufen können.

-Ron

Basierend auf der gleiche MSDN Beschreibung, ich würde davon ausgehen, dass dies bedeutet, dass, wenn keine CWnd zum hWnd als Objekt zur Verfügung gestellt angebracht ist, wird es eine temporäre CWnd schaffen, die einmal etwas geht aus Umfang zerstört werden wahrscheinlich oder ein destructor in anderen Ländern ist, oder ein CWnd explizit erstellt für die hWnd in Frage gestellt wird. Also, wenn Sie bereits ein CWnd erstellt haben, sollten Sie in Ordnung sein, sonst werden Sie wahrscheinlich sehr vorsichtig sein müssen mit dem Speichern des Zeigers Sie erhalten.

Normalerweise wollen sie nur Sie diesen Griff verwenden, mit im Rahmen Ihrer Funktion. Und nicht als Klassenfeld zu speichern, wo Sie es aus dem Leben des Objekts Referenz durch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top