In der Programmierung bezeichnet der Begriff Hook eine Schnittstelle, mit der Programmcode so installiert werden kann, dass er bei Auftreten festgelegter Kriterien ausgeführt wird.
Inhaltsverzeichnis |
Üblicherweise werden Hooks als Funktionszeiger implementiert. Eine aufzurufende Unterroutine wird eingetragen, indem ihre Startadresse an die entsprechende Speicherstelle geschrieben wird. Aufgerufen wird diese Unterroutine dann von dem Programmcode, der den Hook zur Verfügung stellt.
Weitere Möglichkeiten zur Implementierung von Hooks, die aber alle nach ähnlichem Schema ablaufen, stehen in objektorientierten Sprachen (Objektreferenzen auf ganze Hook-Objekte beispielsweise in Java) und in Skriptsprachen (Nennung eines Funktionsnamen) zur Verfügung.
Hooks werden benutzt, um Interrupts abzufangen, aber auch an vielen anderen Stellen, an denen es hilfreich ist, wenn ein Programm sich in einen anderen Ablauf einklinken kann.
Wenn ein Hook mit einer neuen Funktion belegt werden soll, vorher aber schon benutzt wird, muss sichergestellt werden, dass beide Funktionen aufgerufen werden. Normalerweise geschieht das, indem beim Eintragen eines Hooks der alte Inhalt ausgelesen wird. Die neu eingetragene Funktion springt dann nach ihrer Abarbeitung die zuvor eingetragene an. So entsteht eine Kette von Hooks.
Diese Kette ist aber in ihrer Rohform insofern eingeschränkt, als dass ein Hook nicht wieder entfernt werden kann, da eine eventuell nachfolgend eingetragene Funktion zunächst nicht bekannt ist. Um dies zu umgehen, kann man eine einmal eingehängte Funktion einfach eingehängt belassen und sie einfach nichts tun lassen, wenn sie nicht mehr benötigt wird. Ein anderer Ansatz ist der Einsatz einer standardisierten Struktur zur Verwaltung der eingehängten Funktionen. Im Bereich der objektorientierten Sprachen und der Skriptsprachen ist dies verhältnismäßig leicht. Auf Systemebene haben sich auf verschiedenen Plattformen unterschiedliche Vorgehensweisen eingebürgert. Ein Beispiel dafür ist XBRA auf dem Atari ST, bei dem einer eingehängten Funktion ein Header voran geht, mit der ein Hook zu einer doppelt verketteten Liste wird.