プログラミングで「フック」という用語は何を意味していますか?


248

最近、私が書いているプログラムについて何人かの人々と話している間に「フック」という用語を聞いた。フックは関数の一種であると会話から推測しましたが、この用語が何を意味するのか正確にはわかりません。定義を検索しましたが、適切な答えが見つかりませんでした。誰かがこの用語が一般的に何を意味するのか、そしておそらく定義を説明するための小さな例を私に与えることができるでしょうか?


3
Hooking @ Wikipediaを参照してください。リンクは、投票数の少ない回答の1つに埋め込まれています。
Palec 14

回答:


143

基本的に、コード内の場所であり、モジュールを利用して、さまざまな動作を提供したり、何かが発生したときに反応したりすることができます。


7
これはコールバックに似ていますか?
Chris

19
フックはしばしば(常にではありませんが)コールバック関数を使用します。たとえば、「hookEvent(Events.STARTUP、myCallbackFunction)」を使用してイベントシステムをフックできます。関数ポインターをhookEvent関数に渡しているので、イベントが発生したときにどの関数を呼び出すかがわかります。:-)
ウィリアムブレンデル

6
丁度。コールバックはフックの「タイプ」です。
ミカ

21
いいえ。コールバックはコールバックであり、フックとは何の関係もありません。コールバックは、フックメソッドの実装に使用されます。コールバックは関数/メソッド/手続き(CALL)へのポインター(RELJMP)であり、フックは実行中のアプリケーションへの変更です。
specializ

1
@SahilBabbarいいえ。割り込みにより、特定の場所にある命令(割り込み)が実行されます。ただし、たとえば、割り込みハンドラーの場所を一覧表示するテーブルを変更して、コードが割り込み時に最初に呼び出されるようにして、割り込み処理プロセスにフックできる場合があります(次に、コードは以前に存在していた割り込み処理コードを呼び出します)デイジーチェーン方式)
David Tonhofer

77

フックとは、特定の状況下でソフトウェアのユーザーが独自のコードを呼び出せるようにソフトウェアによって提供される機能です。そのコードは、現在のコードを補強または置き換えることができます。

コンピュータが本当に個人的でウイルスがあまり流行していなかった昔(私は80年代の話です)は、オペレーティングシステムソフトウェア自体にパッチを適用してコードを呼び出すだけでした。Apple IIでApplesoft BASIC言語の拡張機能を書いたことを覚えています。これは、行が処理される前にコードを呼び出すことでコードをBASICインタープリターにフックするだけでした。

一部のコンピュータには、あらかじめ設計されたフックがあり、その1つの例はApple IIのI / Oストリームです。このようなフックを使用して、ディスクサブシステム全体を注入しました(Apple II ROMは、当初、カセットがPCの主要なストレージメディアであった時代に構築されました)。ASCIIコード4()に続けて実行したいコマンドを印刷してディスクを制御し、それがApple ROM印刷ルーチンにフックされていたディスクサブシステムによってインターセプトされました。CTRL-DCR

たとえば、次の行:

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

ディスクの内容をリストしてから、マシンを再初期化します。これにより、最初の行を次のように設定してBASICプログラムを保護するなどのトリックが可能になりました。

123 REM XIN#6

次に、があった場所に文字POKEを挿入します。次に、ソースを一覧表示しようとするユーザーは、ディスクサブシステムがソースを検出する出力ルーチンを介して、再初期化シーケンスを送信します。CTRL-DX

多くの場合、それは、私たちが望んだ動作を得るために、私たちが頼らなければならなかった一種の策略です。

最近では、オペレーティングシステムのセキュリティが強化され、オペレーティングシステムを "処理中"またはディスク上で変更する必要がなくなったため、フック自体の機能が提供されます。

彼らは長い間存在しています。メインフレームにはそれらがあり(出口と呼ばれ)、多くのメインフレームソフトウェアが現在でもこれらの機能を使用しています。たとえば、z / OSに付属する無料のソースコード管理システム(SCLMと呼ばれます)では、独自のコードを出口に配置するだけで、セキュリティサブシステムを完全に置き換えることができます。


41

一般的な意味で、「フック」とは、プログラマーであるあなたが、システム/プログラムですでに起こっているものを表示および/または対話したり、変更したりできるものです。

たとえば、Drupal CMSは、「コンテンツノード」が作成された後に追加のアクションを実行できるフックを開発者に提供します。開発者がフックを実装しない場合、ノードは通常どおりに作成されます。開発者がフックを実装すると、ノードが作成されるたびに追加のコードが実行される可能性があります。このコードは、元のアクションのロールバックや変更など、何でも実行できます。また、ノードの作成とはまったく関係のないことを行うこともできます。

コールバックは、特定の種類のフックと考えることができます。システムにコールバック機能を実装することにより、そのシステムでは、アクションが完了した後に追加のコードを呼び出すことができます。ただし、フック(一般的な用語として)はコールバックに限定されません。

もう一つの例。Web開発者は、要素のクラス名やIDをフックと呼ぶことがあります。これは、ID /クラス名を要素に配置することで、JavaScriptを使用してその要素を変更したり、ページドキュメントに「フック」したりできるためです。(これは意味を広げていますが、一般的に使用されており、言及する価値があります)


「ページドキュメントにフック」とはどういう意味ですか?例を挙げていただけますか?私は最初の例を理解しました-javacriptを使用して要素を変更できるようにhtml要素にIDを与えます。
committedandroider

21

シンプルは言った:

フックは、既存のコードの前、後、または代わりにカスタムコード(関数)を実行する手段です。たとえば、通常のログインプロセスに進む前にキャプチャ機能を実行するために、ログインプロセスに「フック」するように関数を書き込むことができます。


ベストアンサーimo
ダニエル

15

フックプログラミングでは、イベントハンドラとして手続きの連鎖を作るために、いわゆるフックを用いる技術です。


15

フックは、基本コードが拡張コードを呼び出すことを可能にする関数のカテゴリです。これは、コア開発者がコードを公開せずに拡張性を提供したい場合に役立ちます。

フックの1つの使用法は、ビデオゲームのmod開発です。ゲームでは、mod開発者が基本機能を拡張できない場合がありますが、コアmodライブラリ開発者がフックを追加できます。これらのフックを使用すると、独立した開発者は、ゲームの読み込み、インベントリの更新、エンティティの相互作用などの任意のイベントでカスタムコードを呼び出すことができます。

実装の一般的な方法は、関数にコールバックの空のリストを与え、コールバックのリストを拡張する機能を公開することです。基本コードは常に適切かつ同時に関数を呼び出しますが、空のコールバックリストでは、関数は何もしません。これは仕様によるものです。

サードパーティは、追加のコードを記述して、新しいコールバックをフックのコールバックリストに追加する機会を得ます。利用可能なフックのリファレンスに過ぎず、基本システムへのリスクを最小限に抑えて機能を拡張しています。

フックは、開発者が他の構造やインターフェースでは実行できないことを行うことを許可していません。これらは、タスクとユーザー(サードパーティの開発者)を考慮して選択する必要があります。

説明のために:フックは拡張を許可し、コールバックを使用して実装できます。コールバックは通常、関数ポインターにすぎません。関数の計算されたアドレス。他の回答/コメントに混乱があるようです。


4

フックは、特定のタイプのイベントをディスパッチするコード内の場所を示します。このイベントが以前にコールバックする適切な関数で登録されていた場合、この登録された関数によって処理されます。それ以外の場合は何も起こりません。


2

フックは、何らかの条件が発生したときに実行できます。たとえば、変数の変更やアクションの呼び出し、イベントの発生などです。フックはプロセスに入り、物事を変更したり、変更に反応したりできます。


1

多くの場合、フッキングはWin32メッセージフッキングまたはLinux / OSX同等物を指しますが、より一般的には、フッキングは、指定されたアクションが発生したときに通知する必要がある別のオブジェクト/ウィンドウ/プログラムなどに単に通知することです。たとえば、システムのすべてのウィンドウを閉じようとすると、ウィンドウが表示されます。

原則として、フッキングはシステムにどのように影響するかを理解せずに行うと、不安定になったり、非常に予期せぬ動作が発生したりする可能性があるため、多少危険です。また、特定の状況で非常に役立つこともあると思います。たとえば、FRAPSはそれを使用して、FPSカウンターが表示されているウィンドウを決定します。


1

フックのチェーンは、各関数が次を呼び出す関数のセットです。フックのチェーンについて重要なことは、プログラマーが実行時にチェーンに別の関数を追加できることです。これを行う1つの方法は、チェーン内の最初の関数のアドレスが保持されている既知の場所を探すことです。次に、その関数ポインターの値を保存し、フックチェーンに挿入する関数のアドレスで初期アドレスの値を上書きします。次に、関数が呼び出され、そのビジネスを実行し、チェーン内の次の関数を呼び出します(別の方法で決定しない限り)。当然のことながら、フックのチェーンを作成するには、RubyやPythonなどの言語のメタプログラミング機能を使用してメモリに直接書き込む方法から、他にもいくつかの方法があります。

フックのチェーンの例は、MS Windowsアプリケーションがメッセージを処理する方法です。処理チェーン内の各関数は、メッセージを処理するか、メッセージをチェーン内の次の関数に送信します。


1

Drupalコンテンツ管理システムでは、「フック」は比較的特定の意味を持っています。内部イベント(コンテンツの作成やユーザーのログインなど)が発生すると、モジュールは特別な「フック」機能を実装することでイベントに応答できます。これは、命名規則(たとえば、ユーザーログインイベントの[your-plugin-name] _user_login())を介して行われます。

この規則により、基になるイベントは「フック」と呼ばれ、DrupalのAPIドキュメントでは「hook_user_login」や「hook_user_authenticate()」のような名前で表示されます。


これは、前述のアイデア以下の上記の何かが起こるとき、「反応する」「コールバック」のを、。この場合、コールバックは明示的に登録されていませんが、「マジックネーミング」に基づいています。これは現在drupal.orgで議論されています。イベントフックにSymfony EventDispatcherを使用する
donquixote

一般化するために、フック/コールバック/リスナーをさまざまな方法で「呼び出し元のコードに知らせる」ことができます(これが完全であるとは言いません)。1.マジック名の関数2.マジック名のクラス3.明示的に登録された関数4.明示的に登録済みオブジェクト(リスナー、サブスクライバー、オブザーバー)5.明示的に登録されたクラス名(およびオプションのコンストラクター引数)。フックが起動する前にインスタンス化されます。6.呼び出し元のコードを修正して
donquixote

1

非常に簡単に言うと、API呼び出しのコードを、自分がMessageBox編集した別の機能を実行する場所などに変更できます(グローバルはシステム全体で機能し、ローカルはプロセス全体で機能します)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.