Ein Handle ist immer nur eine Nummer.. unter Delphi ist der Typ THandle definiert als:
Delphi-Quelltext
1: 2:
| type THandle = LongWord; |
LongWord ist ein unsigned 32Bit Integer - folglich ist ein Handle nur eine Nummer.
Es gibt aber trotzdem viele unterschiedliche Arten von Handles, je nachdem um was für Objekte es sich handelt. Über das Handle (bzw über die "Nummer") verwaltet Windows nun alle möglichen Objekte. zB sind Fenster Objekte die man über das Fenster-Handle anspricht. Willst du also irgendeine API-Funktion verwenden die mit einem Fenster arbeitet, benötigst du die "Nummer" des Fensters (eben das Handle) und teilst diese der API-Funktion mit und damit "weiß" die Funktion um welches Fenster es sich handelt.
Am wichtigsten ist wohl die Unterscheidung zwischen Handles von Kernel-Objekten und User/GDI-Objekten. Zu Kernel-Objekten zählen Prozesse, Threads, Jobs, Mutexe, Semaphore, Events, Pipes, Mailslots, Dateien, MMFs, Zugriffstoken, .. nur um mal einige zu nennen. Kernel-Objekte gehören dem Kernel, nicht einem Prozess. Ein Kernel-Objekt wird also nicht zwangsläufig freigegeben wenn der Prozess, der das Objekt erstellt hat, terminiert, denn es könnte noch einen anderen Prozess geben, der ebenfalls dieses Kernel-Objekt verwendet. Aus diesem Grund verwaltet Windows intern einen Zugriffszähler für Kernel-Objekte.
Jeder Prozess hat eine Handle-Tabelle für seine Kernel-Objekte. Das Handle eines Kernel-Objekts eines Prozesses ist nun nichts anderes als der Index des Objekts in dieser Tabelle. Aus diesem Grund haben Handles von Kernel-Objekten meist sehr niedrige Nummern, während das bei User/GDI-Objekten nicht der Fall ist. So, das war mal nur ein kurzer und recht oberflächiger Ausflug in die Welt der Handles..!
