326

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

4

14 に答える 14

184

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

于 2009-01-21T23:55:28.270 に答える
96

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

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

一部のコンピューターにはフックが事前に設計されており、その一例が 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 と呼ばれる) を使用すると、独自のコードを出口に配置するだけで、セキュリティ サブシステムを完全に置き換えることができます。

于 2009-01-22T00:12:25.007 に答える
58

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

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

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

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

于 2009-01-22T00:18:18.410 に答える
26

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

フックの用途の 1 つは、ビデオ ゲームの mod 開発です。ゲームでは、MOD 開発者が基本機能を拡張することはできませんが、コア Mod ライブラリ開発者はフックを追加できます。これらのフックを使用すると、独立した開発者は、ゲームのロード、インベントリの更新、エンティティの相互作用など、必要なイベントでカスタム コードを呼び出すことができます。

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

サード パーティは、追加のコードを記述し、新しいコールバックをフックのコールバック リストに追加する機会があります。利用可能なフックを参照するだけで、基本システムへのリスクを最小限に抑えて機能を拡張できます。

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

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

于 2016-01-25T15:57:42.383 に答える
19

プログラミングでのフックは、いわゆるフックを使用して、イベントハンドラーとして一連のプロシージャを作成する手法です。

于 2009-01-21T23:58:52.507 に答える
2

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

于 2009-01-22T00:00:41.877 に答える
1

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

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

于 2009-01-22T00:24:51.470 に答える
1

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

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

于 2009-01-22T00:05:53.850 に答える
1

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

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

于 2009-01-22T00:35:15.833 に答える
1

簡単に言えば、API 呼び出しのコードを変更して、MessageBox編集した別の機能をどこで実行するかを変更できます (グローバルにシステム全体で動作し、ローカルでプロセス全体で動作します)。

于 2012-08-18T07:39:23.053 に答える
0

引数として単なる値ではなく、本質的にそれを拡張する別の関数を提供できるようにする関数。

于 2021-11-12T09:38:01.313 に答える