Freigeben über


TN003: Zuordnung von Windows-Handles zu Objekten

Dieser Hinweis wird die MFC-Routinen, die die Zuordnung von C++-Objekten Windows-Objekthandles zu unterstützen.

Das Problem

Windows-Objekte werden in der Regel durch verschiedene HANDLE-Objekte MFC-Klassen-Umbruch Windows-Objekthandles mit C++-Objekten dargestellt.Das Handle umbruchs Funktionen der MFC-Klassen-Bibliothek lassen Sie das C++-Objekt suchen, das das Windows-Objekt umschließt, das ein bestimmtes Handle verfügt.Manchmal verfügt über ein Objekt nicht Wrapperobjekt Ein C++-Compiler und zu diesem Zeitpunkt erstellt das System ein temporäres Objekt, das als C++-Wrapper zu fungieren.

Die Windows-Objekte, dass die für den lauten wie folgt:

  • CWnd (HWND CWnd und abgeleitete Klassen)

  • HDC (CDCCDC und abgeleitete Klassen)

  • HMENU (CMenu)

  • HPEN (CGdiObject)

  • HBRUSH (CGdiObject)

  • HFONT (CGdiObject)

  • CGdiObject(HBITMAP)

  • HPALETTE (CGdiObject)

  • HRGN (CGdiObject)

  • HIMAGELIST (CImageList)

  • SOCKET (CSocket)

Erstellt ein Handle auf eines dieser Objekte können Sie das MFC-Objekt suchen, das das Handle umschließen, indem die statische Methode FromHandle aufruft.Beispielsweise gibt das HWND, das hWnd, die nächste Zeile aufgerufen wird, einen Zeiger auf CWnd zurück, der hWnd umschließt:

CWnd::FromHandle(hWnd)

Wenn hWnd kein bestimmtes Wrapperobjekt verfügt, wird temporäres CWnd erstellt, um hWnd zu umschließen.Auf diese Weise ist es möglich, ein gültiges C++-Objekt von jedem Handle abzurufen.

Nachdem Sie ein Wrapperobjekt abgerufen haben, können Sie das Handle von einer Variable des öffentlichen Members der Wrapperklasse abrufen.Im Fall CWnd enthält m_hWnd HWND für dieses Objekt.

Anfügen von MFC-Objekten Handles zu

Wenn ein neu erstelltes Handle Wrapper Objekt und ein Handle zu einem Windows-Objekt, können Sie die beiden zuordnen, indem Sie die Attach-Funktion aufrufen, wie im folgenden Beispiel:

CWnd myWnd;
myWnd.Attach(hWnd);

Dadurch wird ein Eintrag in der permanenten Zuordnung, die myWnd und hWnd zuordnet.Beim Aufrufen CWnd::FromHandle(hWnd) gibt jetzt einen Zeiger auf myWnd zurück.Wenn myWnd gelöscht wird, zerstört der Destruktor automatisch hWnd, indem Sie das Feature Windows DestroyWindow aufruft.Wenn dies nicht erforderlich ist, muss hWnd von myWnd getrennt werden, bevor myWnd (normalerweise zerstört wird, wenn der Bereich verlassen wird, in dem myWnd definiert wurde).Die Detach-Methode erfolgt.

myWnd.Detach();

Weitere Informationen zu temporären Objekten

Temporäre Objekte werden erstellt, sobald ein Handle FromHandle angegeben ist, die nicht bereits ein Wrapperobjekt verfügt.Diese temporären Objekte werden von ihrem Handle getrennt von der DeleteTempMap gelöscht und Funktionen.Standardmäßig ruft CWinThread::OnIdle automatisch DeleteTempMap für jede Klasse an, die temporäre Handle von Namespacezuordnungen unterstützt.Dies bedeutet, dass Sie nicht davon ausgehen können, dass ein Zeiger auf einen temporären Objekt hinter dem Zeitpunkt der Beendigung von der Funktion gültig ist, in der sich der Zeiger abgerufen wurde.

Wrapper-Objekte und mehreren Threads

werden temporäre und permanente Objekte pro Thread verwaltet.Das heißt, kann ein Thread C++-Wrapper Objekte eines anderen Threads nicht zugreifen, unabhängig davon, ob er temporär oder permanent ist.

Um diese Objekte von einem anderen Thread zu übergeben und senden Sie diese immer als systemeigener HANDLE-Typ.Durch Übergeben des Wrappers Objekts in C++ aus einem anderen Thread führt häufig zu unerwarteten Ergebnissen führen.

Siehe auch

Weitere Ressourcen

Technische Hinweise durch Zahl

Technische Hinweise nach Kategorie