Diese Applikationsschrift beschreibt die MFC Routinen, die Zuordnung von Windows unterstützen Objekt-Handles für C++-Objekte.
Das Problem
Windows-Objekte werden normalerweise durch behandelns dargestellt. Die MFC-Klassen einbinden Windows-Objekt-Handles mit C++-Objekte. Griff Verpackung Funktionen der MFC-Klassenbibliothek bieten eine Möglichkeit, das C++-Objekt zu finden, das das Windows-Objekt mit einem bestimmten Griff Verpackung ist. Es gibt Zeiten, wenn ein Windows-Objekt kein C++-Wrapper-Objekt verfügt jedoch, und zu diesen Zeiten, wenn, die ein temporäres Objekt erstellt wird, als der C++ Wrapper fungieren.
Die Windows-Objekte, die Handlezuordnungen zu verwenden sind:
Da einen Handle für eines dieser Objekte, finden Sie das MFC-Objekt, das den Griff umschließt, indem Sie die statische FromHandle-Memberfunktion aufrufen. Zum Beispiel, da ein HWND hWnd bezeichnet:
CWnd::FromHandle(hWnd)
wird einen Zeiger auf die CWnd zurückzugeben, die das hWndumschließt. Wenn das hWnd keinen bestimmten Wrapper-Objekt verfügt, wird eine temporäre CWnd zum Wickeln Sie das hWnderstellt. Dies macht es möglich, ein gültiges C++-Objekt aus einen beliebigen Griffpunkt.
Sobald Sie ein Wrapper-Objekt haben, gelangen Sie zu den Griff durch eine öffentliche Member-Variable. Im Fall von einer CWndenthält M_hWnd den HWND für das Objekt.
Griffe auf MFC-Objekte anfügen
Angesichts eine neu erstellte Handle-Wrapper-Objekt und ein Handle für ein Windows-Objekt, können Sie die beiden durch den Aufruf von Attachzuordnen. Zum Beispiel:
CWnd MyWnd;
myWnd.Attach(hWnd)
Dadurch wird einen Eintrag in der permanenten Zuordnung zuordnen MyWnd und hWnd. Aufruf CWnd::FromHandle(hWnd) wird nun einen Zeiger auf MyWndzurückzugeben. Wenn MyWnd gelöscht wird, wird der Destruktor automatisch das hWnd zerstören, durch Aufrufen der Windows DestroyWindow -Funktion. Wenn dies nicht gewünscht ist, muss das hWnd aus MyWnd getrennt werden, bevor das MyWnd Objekt zerstört wird (normalerweise beim Verlassen der Gültigkeitsbereich auf die MyWnd definiert wurde). Die Memberfunktion trennen tut dies.
myWnd.Detach()
Mehr über temporäre Objekte
Temporäre Objekte werden erstellt, wenn FromHandle einen Handle angegeben wird, der ein Wrapper-Objekt nicht bereits installiert ist. Diese temporären Objekte werden getrennt von ihren Griff und gelöscht, indem die DeleteTempMap -Funktionen. Die Standardverarbeitung OnIdle in CWinThread ruft automatisch DeleteTempMap für jede Klasse, die temporäre Handlezuordnungen unterstützt. Dies bedeutet, dass Sie können nicht davon ausgehen, dass ein Zeiger auf ein temporäres Objekt gelten wird über den Punkt des Ausgangs aus der Funktion wo war der Zeiger abgerufen, wie das temporäre Objekt in der Windows-Meldungsschleife im Leerlauf Zeit gelöscht werden.
Wrapper-Objekten und mehrerer Threads
Temporäre und permanente Objekte werden auf einer Basis pro Thread verwaltet. Das heißt, zugreifen nicht ein Thread eine andere Threads von C++ Wrapper-Objekten, unabhängig davon, ob es vorübergehend oder dauerhaft. Wie bereits erwähnt, werden temporäre Objekte gelöscht, wenn der Thread gehört das temporäre Objekt OnIdle betritt.
Diese Objekte von einem Thread zu einem anderen, immer senden übergeben geben Sie diese als ihre einheimischen zu behandeln . Ein C++-Wrapper-Objekt von einem Thread an einen anderen übergeben, führt oft zu unerwarteten Ergebnissen.
Technische Hinweise von &Nummer |nbsp; Technische Hinweise nach Kategorie