回答:
基本的に、コード内の場所であり、モジュールを利用して、さまざまな動作を提供したり、何かが発生したときに反応したりすることができます。
フックとは、特定の状況下でソフトウェアのユーザーが独自のコードを呼び出せるようにソフトウェアによって提供される機能です。そのコードは、現在のコードを補強または置き換えることができます。
コンピュータが本当に個人的でウイルスがあまり流行していなかった昔(私は80年代の話です)は、オペレーティングシステムソフトウェア自体にパッチを適用してコードを呼び出すだけでした。Apple IIでApplesoft BASIC言語の拡張機能を書いたことを覚えています。これは、行が処理される前にコードを呼び出すことでコードをBASICインタープリターにフックするだけでした。
一部のコンピュータには、あらかじめ設計されたフックがあり、その1つの例はApple IIのI / Oストリームです。このようなフックを使用して、ディスクサブシステム全体を注入しました(Apple II ROMは、当初、カセットがPCの主要なストレージメディアであった時代に構築されました)。ASCIIコード4()に続けて実行したいコマンドを印刷してディスクを制御し、それがApple ROM印刷ルーチンにフックされていたディスクサブシステムによってインターセプトされました。CTRL-D
CR
たとえば、次の行:
PRINT CHR(4);"CATALOG"
PRINT CHR(4);"IN#6"
ディスクの内容をリストしてから、マシンを再初期化します。これにより、最初の行を次のように設定してBASICプログラムを保護するなどのトリックが可能になりました。
123 REM XIN#6
次に、があった場所に文字POKE
を挿入します。次に、ソースを一覧表示しようとするユーザーは、ディスクサブシステムがソースを検出する出力ルーチンを介して、再初期化シーケンスを送信します。CTRL-D
X
多くの場合、それは、私たちが望んだ動作を得るために、私たちが頼らなければならなかった一種の策略です。
最近では、オペレーティングシステムのセキュリティが強化され、オペレーティングシステムを "処理中"またはディスク上で変更する必要がなくなったため、フック自体の機能が提供されます。
彼らは長い間存在しています。メインフレームにはそれらがあり(出口と呼ばれ)、多くのメインフレームソフトウェアが現在でもこれらの機能を使用しています。たとえば、z / OSに付属する無料のソースコード管理システム(SCLMと呼ばれます)では、独自のコードを出口に配置するだけで、セキュリティサブシステムを完全に置き換えることができます。
一般的な意味で、「フック」とは、プログラマーであるあなたが、システム/プログラムですでに起こっているものを表示および/または対話したり、変更したりできるものです。
たとえば、Drupal CMSは、「コンテンツノード」が作成された後に追加のアクションを実行できるフックを開発者に提供します。開発者がフックを実装しない場合、ノードは通常どおりに作成されます。開発者がフックを実装すると、ノードが作成されるたびに追加のコードが実行される可能性があります。このコードは、元のアクションのロールバックや変更など、何でも実行できます。また、ノードの作成とはまったく関係のないことを行うこともできます。
コールバックは、特定の種類のフックと考えることができます。システムにコールバック機能を実装することにより、そのシステムでは、アクションが完了した後に追加のコードを呼び出すことができます。ただし、フック(一般的な用語として)はコールバックに限定されません。
もう一つの例。Web開発者は、要素のクラス名やIDをフックと呼ぶことがあります。これは、ID /クラス名を要素に配置することで、JavaScriptを使用してその要素を変更したり、ページドキュメントに「フック」したりできるためです。(これは意味を広げていますが、一般的に使用されており、言及する価値があります)
シンプルは言った:
フックは、既存のコードの前、後、または代わりにカスタムコード(関数)を実行する手段です。たとえば、通常のログインプロセスに進む前にキャプチャ機能を実行するために、ログインプロセスに「フック」するように関数を書き込むことができます。
フックは、基本コードが拡張コードを呼び出すことを可能にする関数のカテゴリです。これは、コア開発者がコードを公開せずに拡張性を提供したい場合に役立ちます。
フックの1つの使用法は、ビデオゲームのmod開発です。ゲームでは、mod開発者が基本機能を拡張できない場合がありますが、コアmodライブラリ開発者がフックを追加できます。これらのフックを使用すると、独立した開発者は、ゲームの読み込み、インベントリの更新、エンティティの相互作用などの任意のイベントでカスタムコードを呼び出すことができます。
実装の一般的な方法は、関数にコールバックの空のリストを与え、コールバックのリストを拡張する機能を公開することです。基本コードは常に適切かつ同時に関数を呼び出しますが、空のコールバックリストでは、関数は何もしません。これは仕様によるものです。
サードパーティは、追加のコードを記述して、新しいコールバックをフックのコールバックリストに追加する機会を得ます。利用可能なフックのリファレンスに過ぎず、基本システムへのリスクを最小限に抑えて機能を拡張しています。
フックは、開発者が他の構造やインターフェースでは実行できないことを行うことを許可していません。これらは、タスクとユーザー(サードパーティの開発者)を考慮して選択する必要があります。
説明のために:フックは拡張を許可し、コールバックを使用して実装できます。コールバックは通常、関数ポインターにすぎません。関数の計算されたアドレス。他の回答/コメントに混乱があるようです。
多くの場合、フッキングはWin32メッセージフッキングまたはLinux / OSX同等物を指しますが、より一般的には、フッキングは、指定されたアクションが発生したときに通知する必要がある別のオブジェクト/ウィンドウ/プログラムなどに単に通知することです。たとえば、システムのすべてのウィンドウを閉じようとすると、ウィンドウが表示されます。
原則として、フッキングはシステムにどのように影響するかを理解せずに行うと、不安定になったり、非常に予期せぬ動作が発生したりする可能性があるため、多少危険です。また、特定の状況で非常に役立つこともあると思います。たとえば、FRAPSはそれを使用して、FPSカウンターが表示されているウィンドウを決定します。
フックのチェーンは、各関数が次を呼び出す関数のセットです。フックのチェーンについて重要なことは、プログラマーが実行時にチェーンに別の関数を追加できることです。これを行う1つの方法は、チェーン内の最初の関数のアドレスが保持されている既知の場所を探すことです。次に、その関数ポインターの値を保存し、フックチェーンに挿入する関数のアドレスで初期アドレスの値を上書きします。次に、関数が呼び出され、そのビジネスを実行し、チェーン内の次の関数を呼び出します(別の方法で決定しない限り)。当然のことながら、フックのチェーンを作成するには、RubyやPythonなどの言語のメタプログラミング機能を使用してメモリに直接書き込む方法から、他にもいくつかの方法があります。
フックのチェーンの例は、MS Windowsアプリケーションがメッセージを処理する方法です。処理チェーン内の各関数は、メッセージを処理するか、メッセージをチェーン内の次の関数に送信します。
Drupalコンテンツ管理システムでは、「フック」は比較的特定の意味を持っています。内部イベント(コンテンツの作成やユーザーのログインなど)が発生すると、モジュールは特別な「フック」機能を実装することでイベントに応答できます。これは、命名規則(たとえば、ユーザーログインイベントの[your-plugin-name] _user_login())を介して行われます。
この規則により、基になるイベントは「フック」と呼ばれ、DrupalのAPIドキュメントでは「hook_user_login」や「hook_user_authenticate()」のような名前で表示されます。