欢迎来到朵拉利品网
知识中心
资讯
  • 资讯
  • 产品
  • 供应商
您的位置: 朵拉利品网 >  知识中心 > 钩子函数和回调函数 回调函数 钩子函数 有什么区别
钩子函数和回调函数 回调函数 钩子函数 有什么区别
2020-05-06 10:26:25 来源:朵拉利品网

1, 回调函数 钩子函数 有什么区别



问得不清楚,所以不懂怎么回答这个区别。
所谓回调函数,一般就是把函数的地址作为参数传进去,让调用的函数在内部可以调用这个函数。
例子:
void CALLBACK fun(){...} 这是一个函数,回调函数
void AAA(int a, Fun* p); 这是一个普通函数,但第二个参数是fun
AAA(5, fun);
钩子函数,严格算起来,也算是回调函数的一种。但钩子函数是针对的截取的,当你使用了钩子之后,每当触发到相对应的消息,系统就会先“执行你写的回调函数”。
即原本是:系统-->;目标函数
使用钩子就变成:系统-->;你写的回调函数-->;目标函数
大概原理就是这样子。就不知道你对函数与钩子的了解水平如何了

2, JS钩子函数与回调函数区别



在消息处理机制中必不可少的一组CP,即回调和钩子。
钩子的概念源于Windows的消息处理机制,通过设置钩子,应用程序可以对所有的消息事件进行拦截,然后执行钩子函数,对消息进行想要的处理方式。
接下来是一段js代码,主要用于给btn设置点击的钩子函数
let btn = document.getElementById("btn");
btn.onclick = () => { console.log("i"m a hook");
}钩子是在捕获消息的时候立即执行钩子函数。
下面是一段给btn添加click的监听器。
btn.addEventListener("click",() =>{ console.log(this.onclick);//undefined});这是给btn绑定了一个监听器,后面那个函数是它的回调函数,因为消息捕获的过程我们并不能参与,而在捕获执行完毕的时候,回调函数才会执行,我们可以把对消息的处理写在回调函数里。
js由于自身的特殊性(单线程),因而在代码里充满各式各样的异步操作,因此回调函数也是铺天盖地,上面的两段代码都是异步的。
回调函数和钩子函数的区别
根本上,他们都是为了捕获消息而生的,但是钩子函数在捕获消息的第一时间就会执行,而回调函数是在整个捕获过程结束时,最后一个被执行的。
回调函数其实就是调用者把回调函数的函数指针传递给调用函数,当调用函数执行完毕时,通过函数指针来调用回调函数。

3, 谁能详细的讲一下钩子函数?



钩子函数,举个例子吧,假设你设计了一个程序,它的关键模块是A模块,而A模块中的主要函数是a()函数,
由于这个模块会因为软件的升级需要更新一些功能,而你更新功能的时候又不希望A模块被完全的替换,这时可以采用这样的策略。
在A模块中定义一个函数指针,void(*a)(void);
在调用a()函数的地方使用这样的语句:
if(a) a();
在B模块中实现具体的功能,并且在B模块初始化的时候讲外部定义的函数指针a赋初值,这样当a模块需要更新的时候只要改变B模块中的定义就可以了。
归纳一下:钩子函数就是在真正的模块中只是一个函数指针,而这个指针的赋值是再其它模块中实现的。
不好意思,没说清楚,上面讲的是回调函数,钩子函数属于回调函数的一个特例。 我是做Linux开发,win32平台具体的api不清楚,不过机制都是一样,想看win32可以看这个链接

4, 什么是钩子函数



HHOOK SetWindowsHookEx(
int idHook, // 安装钩子类型
HOOKPROC lpfn, // 回调函数首地址
HINSTANCE hMod, // 调用模块的句柄
DWORD dwThreadId // 需要挂钩的线程ID);
1.回调函数类型和第一个参数有关,但是所有的回调函数格式都是一样的。具体参数用法不一样而已。
2.第2个参数不需要解释了吧?回调函数取地址就行了。
比如&KeyboardProc//键盘钩子回调函数
3.第三个参数是一个句柄,这句柄包含了DLL的句柄。要注意2点,如果第四个参数指定的线程ID是当前进程所创建的,还有,这个钩子程序在当前进程相关联的代码创建一个线程,那么这个参数必须设置为空。
4.这个参数,是指定你需要挂钩的线程ID号。
这个ID一般可以是:GetWindowThreadProcessId 函数的返回值。
更详细的建议你参考下MSDN。
英文不行? ------学啊

5, 谁能给我讲讲setwindowshookex和回调函数,他们之间有参数传递吗...



什么是回调函数?
回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsAPI的调用方式,即__stdcall,当然,DLL编制者可以自己定义调用方式,但客户程序也必须遵守相同的规定。在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。
理解回调函数!
程序在调用一个函数(function)时(通常指api).相当于程序(program)呼叫(Call)了一个函数(function)关系表示如下:
call(调用)
program --------------------→ dll
程序在调用一个函数时,将自己的函数的地址作为参数传递给程序调用的函数时(那么这个自己的函数称回调函数).需要回调函数的 DLL 函数往往是一些必须重复执行某些操作的函数.关系表示如下:
call(调用)
program --------------------→ dll
↑ ¦
¦_______________________________¦
callback(回调)
当你调用的函数在传递返回值给回调函数时,你就可以利用回调函数来处理或完成一定的操作。至于如何定义自己的回调函数,跟具体使用的API函数有关,很多不同类别的回调函数有各种各样的参数,有关这些参数的描述一般在帮助中有说明回调函数的参数和返回值等.其实简单说回调函数就是你所写的函数满足一定条件后,被DLL调用!
也有这样的说法(比较容易理解):
回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。为此,你需要做三件事:
1. 声明;
2. 定义;
3. 设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于DLL调用。

名词解释


函数

函数(function)在数学中为两不为空集的集合间的一种对应关系:输入值集合中的每项元素皆能对应唯一一项输出值集合中的元素。 其定义通常分为传统定义和近代定义,前者从运动变化的观点出发,而后者从集合、映射的观点出发。其近代定义是给定一个数集A,假设其中的元素为x,对A中的元素x施加对应法则f,记作f(x),得到另一数集B,假设B中的元素为y,则y与x之间的等量关系可以用y=f(x)表示。函数概念含有三个要素:定义域A、值域C和对应法则f。

钩子

钩子,草本植物。钩子为蔷薇科悬钩子属的植物。分布於朝鲜、北欧、俄罗斯、蒙古以及中国大陆的吉林、辽宁、黑龙江等地,生长於海拔1,200米的地区,多生於侧坡、林下以及沟旁,尚未由人工引种栽培。

gt

GT:拉丁文Gran Turismo,英文翻译为Grand Tourer,Grand的意思是豪华,而Tourer的意思是旅行者、巡游者的意思。Grand Tourer加在一起,其实是解作豪华旅行车。