首页 文章

编程中的术语“钩子”是什么意思?

提问于
浏览
203

我最近在与一些人谈论我正在编写的程序时听到了“钩子”一词 . 虽然我从对话中推断钩子是一种函数,但我不确定这个术语的含义 . 我搜索了一个定义,但无法找到一个好的答案 . 有人能够让我知道这个术语通常意味着什么,也许是一个小例子来说明这个定义?

12 回答

  • 68

    从本质上讲,它是代码中的一个位置,允许您接入模块以提供不同的行为或在发生某些事情时做出反应 .

  • 0

    钩子是由软件提供的功能,用于该软件的用户在某些情况下调用他们自己的代码 . 该代码可以扩充或替换当前代码 .

    在过去,计算机真正是个人化的,病毒不那么流行(我说的是80年代),就像修补操作系统软件本身来调用你的代码一样简单 . 我记得在Apple II上编写了Applesoft BASIC语言的扩展,它简单地将我的代码挂钩到BASIC解释器,方法是在处理任何一行之前调用我的代码 .

    有些计算机有预先设计的钩子,其中一个例子是Apple II上的I / O流 . 它使用这样的钩子来注入整个磁盘子系统(Apple II ROM最初是在盒式磁带是PC的主要存储介质的时代制造的) . 您通过打印ASCII代码4( CTRL-D )然后执行您要执行的命令 CR 来控制磁盘,并且它被磁盘子系统拦截,该子系统已连接到Apple ROM打印例程 .

    例如,行:

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

    列出磁盘内容然后重新初始化机器 . 这允许通过将第一行设置为保护您的BASIC程序的技巧:

    123 REM XIN#6
    

    然后使用 POKEX 所在的位置插入 CTRL-D 字符 . 然后,任何试图列出源的人都会通过磁盘子系统检测到的输出例程发送重新初始化序列 .

    这通常是我们不得不诉诸的一种技巧,以获得我们想要的行为 .

    如今,随着操作系统更加安全,它为钩子本身提供了便利,因为您不再需要“在飞行中”或在磁盘上修改操作系统 .

    他们已经存在了很长时间 . 大型机有它们(称为出口),大量的大型机软件甚至现在也使用这些设备 . 例如,z / OS附带的免费源代码控制系统(称为SCLM)允许您通过简单地将自己的代码放在出口中来完全替换安全子系统 .

  • 125

    从一般意义上讲,“钩子”可以让您,程序员,查看和/或交互和/或改变系统/程序中已经发生的事情 .

    例如,Drupal CMS为开发人员提供了钩子,让他们在创建“内容节点”后采取其他操作 . 如果开发人员没有实现钩子,则按正常方式创建节点 . 如果开发人员实现了一个钩子,那么只要创建一个节点,他们就可以运行一些额外的代码 . 此代码可以执行任何操作,包括回滚和/或更改原始操作 . 它也可以完全与节点创建无关 .

    回调可以被认为是一种特定的钩子 . 通过在系统中实现回调功能,该系统允许您在操作完成后调用一些其他代码 . 但是,挂钩(作为通用术语)不仅限于回调 .

    另一个例子 . 有时Web开发人员会将元素上的类名和/或ID称为钩子 . 这是因为通过将ID /类名放在元素上,然后他们可以使用Javascript来修改该元素,或者“挂钩”到页面文档 . (这是拉伸意义,但它是常用的,值得一提)

  • 1

    钩子是一类功能,允许基本代码调用扩展代码 . 这在核心开发人员希望在不暴露其代码的情况下提供可扩展性的情况下非常有用 .

    钩子的一种用法是在视频游戏模型开发中 . 游戏可能不允许mod开发人员扩展基本功能,但是核心mod库开发人员可以添加钩子 . 有了这些钩子,独立开发人员可以根据任何需要的事件调用自定义代码,例如游戏加载,库存更新,实体交互等

    一种常见的实现方法是为函数提供一个空的回调列表,然后公开扩展回调列表的能力 . 基本代码将始终在相同和适当的时间调用该函数,但是,使用空回调列表,该函数不执行任何操作 . 这是设计的 .

    然后,第三方有机会编写其他代码并将其新回调添加到钩子的回调列表中 . 除了可用挂钩的参考之外,它们还以最小的风险扩展了基本系统 .

    钩子不允许开发人员做任何其他结构和接口无法完成的事情 . 它们是考虑到任务和用户(第三方开发人员)的选择 .

    为了澄清:钩子允许扩展,可以使用回调实现 . 回调通常只是一个函数指针;计算的函数地址 . 其他答案/评论似乎有些混乱 .

  • 1

    编程中的Hooking是一种采用所谓的钩子将一系列过程作为事件处理程序的技术 .

  • 4

    简单说:

    钩子是在现有代码之前,之后或代替现有代码执行自定义代码(函数)的手段 . 例如,可以编写函数以“挂钩”到登录过程中,以便在继续正常登录过程之前执行验证码功能 .

  • 34

    Hook表示代码中您发送某种类型事件的位置,如果此事件之前已使用适当的函数进行回调注册,那么它将由此注册函数处理,否则不会发生任何事情 .

  • 13

    遇到某些条件时可以执行钩子 . 例如调用某些变量或某些操作或发生某些事件 . 钩子可以进入过程并改变事物或对变化作出反应 .

  • 14

    通常挂钩指的是Win32 message hooking或Linux / OSX等价物,但更通用的挂钩只是通知另一个对象/窗口/程序/等您希望在指定的操作发生时得到通知 . 例如:让系统上的所有窗口通知您即将关闭 .

    作为一般规则,挂钩有点危险,因为在不了解它如何影响系统的情况下进行挂钩会导致不稳定或出现意外行为 . 思想认为,它在某些情况下也非常有用 . 例如:FRAPS使用它来确定它应该显示哪个窗口的FPS计数器 .

  • 2

    在Drupal内容管理系统中,'hook'具有相对特定的含义 . 当发生内部事件时(例如,内容创建或用户登录),模块可以通过实现特殊的“钩子”功能来响应事件 . 例如,这是通过命名约定 - 用户登录事件的[your-plugin-name] _user_login()来完成的 .

    由于这种约定,底层事件被称为“钩子”,并在Drupal的API文档中以“hook_user_login”和“hook_user_authenticate()”等名称出现 .

  • 0

    钩子链是一组函数,其中每个函数调用下一个函数 . 一系列钩子的重要意义在于程序员可以在运行时向链中添加另一个函数 . 一种方法是查找保持链中第一个函数的地址的已知位置 . 然后保存该函数指针的值,并使用要插入到挂钩链中的函数的地址覆盖初始地址处的值 . 然后调用该函数,执行其业务并调用链中的下一个函数(除非您另有决定) . 当然,还有许多其他方法可以创建一系列钩子,从直接写入内存到使用Ruby或Python等语言的元编程工具 .

    挂钩链的一个示例是MS Windows应用程序处理消息的方式 . 处理链中的每个函数都处理消息或将消息发送到链中的下一个函数 .

  • 9

    非常简短,您可以将API调用的代码(例如 MessageBox )更改为它所执行的不同功能(全局将在系统范围内工作,本地将在进程范围内工作) .

相关问题