Was versteht man unter dem Begriff "Hook" in der Programmierung?

248

Ich habe kürzlich den Begriff "Hook" gehört, als ich mit einigen Leuten über ein Programm gesprochen habe, das ich geschrieben habe. Ich bin mir nicht sicher, was dieser Begriff genau impliziert, obwohl ich aus dem Gespräch gefolgert habe, dass ein Hook eine Art Funktion ist. Ich suchte nach einer Definition, konnte aber keine gute Antwort finden. Könnte mir jemand eine Vorstellung davon geben, was dieser Begriff im Allgemeinen bedeutet, und vielleicht ein kleines Beispiel, um die Definition zu veranschaulichen?

Chris
quelle
3
Siehe Hooking @ Wikipedia . Der Link ist in einer der Antworten mit niedrigerer Abstimmung vergraben.
Palec

Antworten:

143

Im Wesentlichen handelt es sich um eine Stelle im Code, an der Sie auf ein Modul zugreifen können, um entweder ein anderes Verhalten bereitzustellen oder um zu reagieren, wenn etwas passiert.

Micah
quelle
7
Ist das ähnlich wie bei einem Rückruf?
Chris
19
Hooks verwenden häufig (aber nicht immer) Rückruffunktionen. Beispielsweise können Sie ein Ereignissystem mit "hookEvent (Events.STARTUP, myCallbackFunction)" verknüpfen. Sie übergeben einen Funktionszeiger an die Funktion hookEvent, damit diese weiß, welche Funktion beim Auftreten des Ereignisses aufgerufen werden muss. Hoffe das hilft :-)
William Brendel
6
genau. Ein Rückruf ist eine Art "Haken".
Micah
21
ähm ... nein. Ein Rückruf ist ein Rückruf und hat nichts mit Hooks zu tun. Rückrufe werden einfach zur UMSETZUNG von Hook-Methoden verwendet. Rückrufe sind Zeiger (RELJMP) auf Funktionen / Methoden / Prozeduren (CALL), Hooks sind Änderungen an laufenden Anwendungen.
Spezialisiert
1
@SahilBabbar Nein. Ein Interrupt bewirkt, dass die Anweisungen an einer bestimmten Stelle (dem Interrupt) ausgeführt werden. Möglicherweise können Sie sich jedoch in den Interrupt-Bearbeitungsprozess einbinden, indem Sie beispielsweise die Tabelle ändern, in der die Positionen der Interrupt-Handler aufgeführt sind, sodass Ihr Code beim Interrupt zuerst aufgerufen wird (und Ihr Code dann den zuvor vorhandenen Interrupt-Handling-Code in aufruft) eine Daisy-Chain-Art)
David Tonhofer
77

Ein Hook ist eine von der Software bereitgestellte Funktionalität, mit der Benutzer dieser Software unter bestimmten Umständen ihren eigenen Code aufrufen können. Dieser Code kann den aktuellen Code erweitern oder ersetzen.

In den alten Tagen, als Computer wirklich persönlich waren und Viren weniger verbreitet waren (ich spreche von den 80ern), war es so einfach wie das Patchen der Betriebssystemsoftware selbst, um Ihren Code aufzurufen. Ich erinnere mich, dass ich auf dem Apple II eine Erweiterung der Applesoft BASIC-Sprache geschrieben habe, in der mein Code einfach in den BASIC-Interpreter eingebunden wurde, indem ein Aufruf meines Codes eingefügt wurde, bevor eine der Zeilen verarbeitet wurde.

Einige Computer hatten vorgefertigte Hooks, ein Beispiel war der E / A-Stream auf dem Apple II. Es verwendete einen solchen Hook, um das gesamte Festplattensubsystem zu injizieren (Apple II-ROMs wurden ursprünglich in den Tagen gebaut, als Kassetten das primäre Speichermedium für PCs waren). Sie haben die Festplatten gesteuert, indem Sie den ASCII-Code 4 ( ) gefolgt von dem Befehl gedruckt haben, den CTRL-DSie ausführen möchten, und dann aCR , und , und er wurde vom Datenträgersubsystem abgefangen, das sich in die Apple ROM-Druckroutinen eingebunden hatte.

So zum Beispiel die Zeilen:

PRINT CHR(4);"CATALOG"
PRINT CHR(4);"IN#6"

würde den Festplatteninhalt auflisten und dann den Computer neu initialisieren. Dies ermöglichte Tricks wie den Schutz Ihrer BASIC-Programme durch Setzen der ersten Zeile wie folgt:

123 REM XIN#6

Verwenden Sie dann POKE, um das CTRL-DZeichen dort einzufügen, wo dieX war. Dann würde jeder, der versucht, Ihre Quelle aufzulisten, die Neuinitialisierungssequenz über die Ausgaberoutinen senden, wo das Festplattensubsystem sie erkennen würde.

Das ist oft die Art von Trick, auf die wir zurückgreifen mussten, um das gewünschte Verhalten zu erreichen.

Heutzutage bietet das sicherere Betriebssystem Funktionen für Hooks selbst, da Sie das Betriebssystem nicht mehr "während des Flugs" oder auf der Festplatte ändern sollten.

Sie sind schon lange da . Mainframes hatten sie (Exits genannt) und viele Mainframe-Software nutzt diese Funktionen auch jetzt noch. Mit dem mit z / OS gelieferten kostenlosen Quellcodeverwaltungssystem (SCLM) können Sie beispielsweise das Sicherheitssubsystem vollständig ersetzen, indem Sie einfach Ihren eigenen Code in den Exit einfügen.

paxdiablo
quelle
41

Im allgemeinen Sinne ist ein "Hook" etwas, mit dem Sie als Programmierer etwas anzeigen und / oder interagieren und / oder etwas ändern können, das bereits in einem System / Programm vor sich geht.

Das Drupal-CMS bietet Entwicklern beispielsweise Hooks, mit denen sie zusätzliche Aktionen ausführen können, nachdem ein "Inhaltsknoten" erstellt wurde. Wenn ein Entwickler keinen Hook implementiert, wird der Knoten normal erstellt. Wenn ein Entwickler einen Hook implementiert, kann bei jeder Erstellung eines Knotens zusätzlicher Code ausgeführt werden. Dieser Code kann alles tun, einschließlich Zurücksetzen und / oder Ändern der ursprünglichen Aktion. Es könnte auch etwas tun, das nichts mit der Knotenerstellung zu tun hat.

Ein Rückruf könnte als eine bestimmte Art von Haken angesehen werden. Durch die Implementierung der Rückruffunktion in einem System können Sie nach Abschluss einer Aktion zusätzlichen Code aufrufen. Das Einbinden (als Oberbegriff) ist jedoch nicht auf Rückrufe beschränkt.

Ein anderes Beispiel. Manchmal bezeichnen Webentwickler Klassennamen und / oder IDs für Elemente als Hooks. Dies liegt daran, dass sie durch Platzieren des ID- / Klassennamens auf einem Element dieses Element mithilfe von Javascript ändern oder sich in das Seitendokument "einhängen" können. (Dies erweitert die Bedeutung, wird aber häufig verwendet und ist erwähnenswert.)

Alan Storm
quelle
Was meinst du mit "In das Seitendokument einbinden"? Könnten Sie ein Beispiel geben? Ich habe das erste Beispiel verstanden - einem HTML-Element eine ID zu geben, damit Sie das Element mit javacript ändern können.
committedandroider
21

Einfach gesagt:

Ein Hook ist ein Mittel zum Ausführen von benutzerdefiniertem Code (Funktion) entweder vor, nach oder anstelle von vorhandenem Code. Beispielsweise kann eine Funktion so geschrieben werden, dass sie sich in den Anmeldevorgang "einhakt", um eine Captcha-Funktion auszuführen, bevor mit dem normalen Anmeldevorgang fortgefahren wird.

Joseph Vernice
quelle
Beste Antwort imo
Daniel
15

Das Einbinden in die Programmierung ist eine Technik, bei der sogenannte Hooks verwendet werden, um als Ereignishandler eine Kette von Prozeduren zu erstellen.

geowa4
quelle
15

Hooks sind eine Funktionskategorie, mit der der Basiscode den Erweiterungscode aufrufen kann. Dies kann in Situationen nützlich sein, in denen ein Kernentwickler Erweiterbarkeit anbieten möchte, ohne seinen Code verfügbar zu machen.

Eine Verwendung von Hooks ist die Entwicklung von Videospielmods. Ein Spiel erlaubt Mod-Entwicklern möglicherweise nicht, die Basisfunktionalität zu erweitern, aber Hooks können von Entwicklern der Core-Mod-Bibliothek hinzugefügt werden. Mit diesen Hooks können unabhängige Entwickler ihren benutzerdefinierten Code für jedes gewünschte Ereignis aufrufen lassen, z. B. für das Laden von Spielen, Inventaraktualisierungen, Interaktionen mit Entitäten usw.

Eine übliche Implementierungsmethode besteht darin, einer Funktion eine leere Liste von Rückrufen zu geben und dann die Möglichkeit bereitzustellen, die Liste der Rückrufe zu erweitern. Der Basiscode ruft die Funktion immer zur gleichen und richtigen Zeit auf, aber bei einer leeren Rückrufliste führt die Funktion nichts aus. Dies ist beabsichtigt.

Ein Dritter hat dann die Möglichkeit, zusätzlichen Code zu schreiben und seinen neuen Rückruf zur Rückrufliste des Hooks hinzuzufügen. Mit nur einer Referenz verfügbarer Haken verfügen sie über erweiterte Funktionen bei minimalem Risiko für das Basissystem.

Mit Hooks können Entwickler nichts tun, was mit anderen Strukturen und Schnittstellen nicht möglich ist. Sie sind eine Entscheidung, die unter Berücksichtigung der Aufgabe und der Benutzer (Drittentwickler) getroffen werden muss.

Zur Verdeutlichung: Ein Hook ermöglicht die Erweiterung und kann mithilfe von Rückrufen implementiert werden. Rückrufe sind im Allgemeinen nichts anderes als ein Funktionszeiger. die berechnete Adresse einer Funktion. Andere Antworten / Kommentare scheinen Verwirrung zu stiften.

Jack Stout
quelle
4

Hook bezeichnet eine Stelle im Code, an der Sie ein Ereignis eines bestimmten Typs auslösen. Wenn dieses Ereignis zuvor mit einer geeigneten Rückruffunktion registriert wurde, wird es von dieser registrierten Funktion behandelt, da sonst nichts passiert.

dringend
quelle
2

Hooks können ausgeführt werden, wenn eine Bedingung vorliegt. zB einige Variablenänderungen oder eine Aktion wird aufgerufen oder ein Ereignis tritt ein. Hooks können in den Prozess eintreten und Dinge ändern oder auf Änderungen reagieren.

dusoft
quelle
1

Häufig bezieht sich das Verknüpfen auf das Verknüpfen von Win32-Nachrichten oder die Linux / OSX-Entsprechungen. Allgemeiner wird beim Verknüpfen jedoch einfach ein anderes Objekt / Fenster / Programm / usw. benachrichtigt, dass Sie benachrichtigt werden möchten, wenn eine bestimmte Aktion ausgeführt wird. Beispiel: Wenn alle Fenster im System Sie benachrichtigen, sobald sie geschlossen werden.

In der Regel ist das Einhaken etwas gefährlich, da es zu Instabilität oder zumindest zu unerwartetem Verhalten führen kann, ohne zu verstehen, wie es sich auf das System auswirkt. Es kann unter bestimmten Umständen auch SEHR nützlich sein, dachte man. Beispiel: FRAPS verwendet es, um zu bestimmen, in welchen Fenstern der FPS-Zähler angezeigt werden soll.

Toji
quelle
1

Eine Kette von Haken ist eine Reihe von Funktionen, in denen jede Funktion die nächste aufruft. Was an einer Kette von Hooks wichtig ist, ist, dass ein Programmierer der Kette zur Laufzeit eine weitere Funktion hinzufügen kann. Eine Möglichkeit, dies zu tun, besteht darin, nach einem bekannten Ort zu suchen, an dem die Adresse der ersten Funktion in einer Kette gespeichert ist. Anschließend speichern Sie den Wert dieses Funktionszeigers und überschreiben den Wert an der Anfangsadresse mit der Adresse der Funktion, die Sie in die Hook-Kette einfügen möchten. Die Funktion wird dann aufgerufen, erledigt ihre Geschäfte und ruft die nächste Funktion in der Kette auf (sofern Sie nichts anderes entscheiden). Natürlich gibt es eine Reihe anderer Möglichkeiten, eine Kette von Hooks zu erstellen, vom direkten Schreiben in den Speicher bis zur Verwendung der Metaprogrammierfunktionen von Sprachen wie Ruby oder Python.

Ein Beispiel für eine Kette von Hooks ist die Art und Weise, wie eine MS Windows-Anwendung Nachrichten verarbeitet. Jede Funktion in der Verarbeitungskette verarbeitet entweder eine Nachricht oder sendet sie an die nächste Funktion in der Kette.

Joe Seelenbringer
quelle
1

Im Drupal-Content-Management-System hat "Hook" eine relativ spezifische Bedeutung. Wenn ein internes Ereignis auftritt (z. B. die Erstellung von Inhalten oder die Benutzeranmeldung), können Module auf das Ereignis reagieren, indem sie eine spezielle "Hook" -Funktion implementieren. Dies erfolgt beispielsweise über die Namenskonvention - [Ihr-Plugin-Name] _user_login () für das Benutzeranmeldeereignis.

Aufgrund dieser Konvention werden die zugrunde liegenden Ereignisse als "Hooks" bezeichnet und in der API-Dokumentation von Drupal mit Namen wie "hook_user_login" und "hook_user_authenticate ()" angezeigt.

Eaton
quelle
Dies folgt der oben erwähnten Idee eines "Rückrufs", "um zu reagieren, wenn etwas passiert". In diesem Fall wird der Rückruf nicht explizit registriert, sondern basiert auf "magischer Benennung". Dies wird derzeit auf drupal.org diskutiert, siehe Symfony EventDispatcher für Event-Hooks verwenden
donquixote
Um es zu verallgemeinern, kann ein Hook / Callback / Listener auf verschiedene Arten "dem aufrufenden Code bekannt gemacht" werden (ohne dass dies vollständig ist): 1. Funktionen mit magischen Namen 2. Klassen mit magischen Namen 3. explizit registrierte Funktionen 4. explizit registrierte Objekte (Listener, Abonnenten, Beobachter) 5. explizit registrierte Klassennamen (+ optionale Konstruktorargumente), die instanziiert werden müssen, bevor der Hook ausgelöst wird. 6. durch Ändern des aufrufenden Codes
donquixote
1

Kurz gesagt, Sie können den Code eines API-Aufrufs dahingehend ändern MessageBox, dass er eine andere von Ihnen bearbeitete Funktion ausführt (global funktioniert systemweit, lokal funktioniert prozessweit).

Kenny Barker
quelle