Was ist eigentlich ein HANDLE?



  • Hallo,

    wer kann mir mal kurz erklären, was es bedeutet, wenn ich mir ein Handle auf ein Fenster hole. Ist das nur ein anderer Typ als CWnd oder liegen da ganz andere Dimensionen zwischen?



  • Siehe:
    Was ist ein Zeiger?



  • CWnd ist kein Typ sondern eine Klasse



  • Ein HANDLE ist soviel ich weiss eine eindeutige Identifikation mit der Windows eine bestimmte Resource kennzeichnet. Deshalb wird auch mit der WinAPI alles mit handles erledigt. Im Prinzip ist ein Handle kaum was anderes als eine Nummer...

    -junix



  • @junix
    also auf deutsch: ein Zeiger



  • Anonymous schrieb:

    @junix
    also auf deutsch: ein Zeiger

    Falsch.

    -junix



  • Kommt drauf an wie man Zeiger definiert. Ein Zeiger im Sinne von C++-Zeigern ist es sicher nicht.



  • MaSTaH schrieb:

    Kommt drauf an wie man Zeiger definiert. Ein Zeiger im Sinne von C++-Zeigern ist es sicher nicht.

    Wir sind hier in einem C(++) Forum, was glaubst du wie die Mehrheit hier "Zeiger" definiert? Ausserdem ist die Bezeichnung "Zeiger" so oder so unpassend.

    -junix



  • @MaSTaH
    Da die API in C, und nicht in C++ ist, ist es logischerweise kein C++-Zeiger. Denn es ist ein Zeiger auf eine Struktur.
    Wenn also Microsoft behauptet, ein Zeiger auf eine Struktur ist ein HANDLE, dann ist das ihre Sache. Prinzipiell ist und bleibt es aber ein Zeiger.



  • aus MSDN:

    Handle (Definition):
    Eine Nummer, die einem Fenster zugewiesen wird und mit der das Betriebssystem die Attribute des Fensters findet. In einer C oder C++ Bibliothek wird das Handle durch einen Zeiger dargestellt.

    handle:
    A variable that identifies an object; an indirect reference to an operating system resource.

    Windows objects are normally represented by HANDLEs. The MFC classes wrap Windows object handles with C++ objects. The handle wrapping functions of the MFC class library provide a way to find the C++ object that is wrapping the Windows object with a particular handle. There are times when a Windows object does not have a C++ wrapper object, however, and at these times a temporary object is created to act as the C++ wrapper.

    The Windows objects that use handle maps are:

    HWND (CWnd and CWnd-derived classes)
    HDC (CDC and CDC-derived classes)
    HMENU (CMenu)
    HPEN (CGdiObject)
    HBRUSH (CGdiObject)
    HFONT (CGdiObject)
    HBITMAP (CGdiObject)
    HPALETTE (CGdiObject)
    HRGN (CGdiObject)
    HIMAGELIST (CImageList)
    SOCKET (CSocket)

    Given a handle to any of these objects, you can find the MFC object that wraps the handle by calling the static member function FromHandle. For example, given an HWND called hWnd:

    CWnd::FromHandle(hWnd)

    will return a pointer to the CWnd that wraps the hWnd. If that hWnd does not have a specific wrapper object, then a temporary CWnd is created to wrap the hWnd. This makes it possible to get a valid C++ object from any handle. Once you have a wrapper object, you can get to its handle through a public member variable. In the case of an CWnd, m_hWnd contains the HWND for that object.

    Attaching Handles to MFC Objects

    Given a newly created handle-wrapper object and a handle to a Windows object, you can associate the two by calling Attach. For example:

    CWnd myWnd;
    myWnd.Attach(hWnd);

    This makes an entry in the permanent map associating myWnd and hWnd. Calling CWnd::FromHandle(hWnd) will now return a pointer to myWnd. When myWnd is deleted, the destructor will automatically destroy the hWnd by calling the Windows DestroyWindow function. If this is not desired, the hWnd must be detached from myWnd before the myWnd object is destroyed (normally when leaving the scope at which myWnd was defined). The Detach member function does this.

    myWnd.Detach();



  • Bitte nicht gleich prügeln hier... 🙂
    Danke für Eure Erklärungen!
    Also ist es im Prinzip egal, ob ich mir Beispielsweise für ein Fenster einen Zeiger auf ein CWnd-Objekt hole oder ein Handle auf das Fenster. Erfüllt beides den gleichen Zweck nur auf andere Art und Weise, wenn ich das richtig vertanden habe?



  • MuehBln schrieb:

    Erfüllt beides den gleichen Zweck ...

    Diese Aussage dürfte in Abhängigkeit des "Zweckes" sowohl richtig als auch falsch sein. 🕶



  • Da sich MS in ihrer Arbeistweise schwerpunktmäßig auf handles stützt, sollte man diese auch benutzen.

    Um es aus meiner Sicht noch mal darzustellen. Ein Handle ist ein Index auf ein solches Objekt es mit Zeiger (pointer) zu bezeichnen halte ich für gefährlich.

    Es wird kein C-Pointer geliefert der auf die Speicherstelle zeigt sondern eher so etwas wie ein Index in Array, wleches vom System verwaltet wird.
    wenn man sich die Werte der Handles anschaut sind das meistens Integer Zahlen und keine 32 Bit Pointer



  • @PAD

    so etwas wie ein Index in Array

    Ahja, wieso wird dann ein HANDLE als typedef void* und nicht als typedef long beschrieben?

    Es wird kein C-Pointer geliefert

    Also wenn ich 2 Fenster hintereinander anlege, liefert mir das 2. eine Adresse, genau sizeof(void*) grösser als die des 1. Fensters. Wieso sollte ein Array-Index immer um 4 ansteigen?

    wenn man sich die Werte der Handles anschaut sind das meistens Integer Zahlen und keine 32 Bit Pointer

    Was ist der Unterschied zwischen einem 32bit-Integer und einem 32bit-Pointer?

    solches Objekt es mit Zeiger (pointer) zu bezeichnen halte ich für gefährlich

    Es ist aber nichts anderes. Nur kann man nicht aus dem Zeiger erkennen, ob es sich um ein HWND oder ein HPEN oder ein HBRUSH handelt.



  • Danke für die Korrektur hatte es mit einem anderen Begriff verwechselt

    😃


Anmelden zum Antworten