问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何向回调函数中传入其他参数

发布网友 发布时间:2022-04-13 02:05

我来回答

2个回答

热心网友 时间:2022-04-13 03:35

成员函数名不能作为参数传递,否则会发生错误,因为里面隐藏着一个this 指针
回调函数,就是由你自己写的。你需要调用另外一个函数,而这个函数的其中一个参数,就
是你的这个回调函数名。这样,系统在必要的时候,就会调用你写的回调函数,这样你就可
以在回调函数里完成你要做的事。
模块A有一个函数foo,它向模块B传递foo的地址,然后在B里面发生某种事件(event)时,通过从A里面传递过来的foo的地址调用foo,通知A发生了什么事情,让A作出相应反应。 那么我们就把foo称为回调函数。

例子:
回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数在windows编程使用的场合很多,比如Hook回调函数:MouseProc,GetMsgProc以及EnumWindows,DrawState的回调函数等等,还有很多系统级的回调过程。本文不准备介绍这些函数和过程,而是谈谈实现自己的回调函数的一些经验。
之所以产生使用回调函数这个想法,是因为现在使用VC和Delphi混合编程,用VC写的一个DLL程序进行一些时间比较长的异步工作,工作完成之后,需要通知使用DLL的应用程序:某些事件已经完成,请处理事件的后续部分。开始想过使用同步对象,文件影射,消息等实现DLL函数到应用程序的通知,后来突然想到可不可以在应用程序端先写一个函数,等需要处理后续事宜的时候,在DLL里直接调用这个函数即可。
于是就动手,写了个回调函数的原形。在VC和 Delphi里都进行了测试
一:声明回调函数类型。
vc版
typedef int (WINAPI *PFCALLBACK)(int Param1,int Param2) ;
二:声明回调函数原形
声明函数原形
vc版
int WINAPI CBFunc(int Param1,int Param2);
三: 回调函数调用调用者
调用回调函数的函数我把它放到了DLL里,这是一个很简单的VC生成的WIN32 DLL.并使用DEF文件输出其函数名 TestCallBack。实现如下:
PFCALLBACK gCallBack=0;

void WINAPI TestCallBack(PFCALLBACK Func)
{
if(Func==NULL)return;
gCallBack=Func;
DWORD ThreadID=0;
HANDLE hThread = CreateThread( NULL, NULL, Thread1, LPVOID(0), &ThreadID );
return;
}
此函数的工作把传入的 PFCALLBACK Func参数保存起来等待使用,并且启动一个线程。声明了一个函数指针PFCALLBACK gCallBack保存传入的函数地址。
四: 回调函数如何被使用:
TestCallBack函数被调用后,启动了一个线程,作为演示,线程人为的进行了延时处理,并且把线程运行的过程打印在屏幕上.
五:万事具备
使用vc和Delphi各建立了一个工程,编写回调函数的实现部分
VC版
int WINAPI CBFunc(int Param1,int Param2)
{
int res= Param1+Param2;
TCHAR Buffer[256]="";
sprintf(Buffer,"callback result = %d",res);
MessageBox(NULL,Buffer,"Testing",MB_OK); //演示回调函数被调用
return res;
}

Delphi版
function CBFunc(Param1,Param2:integer):integer;
begin
result:= Param1+Param2;
TForm1.Edit1.Text:=inttostr(result); / /演示回调函数被调用
end;

使用静态连接的方法连接DLL里的出口函数 TestCallBack,在工程里添加 Button( 对于Delphi的工程,还需要在Form1上放一个Edit控件,默认名为Edit1)。
响应ButtonClick事件调用 TestCallBack

TestCallBack(CBFunc) //函数的参数CBFunc为回调函数的地址

函数调用创建线程后立刻返回,应用程序可以同时干别的事情去了。现在可以看到屏幕上不停的显示字符串,表示dll里创建的线程运行正常。一会之后,线程延时部分结束结束,vc的应用程序弹出MessageBox,表示回调函数被调用并显示根据Param1,Param2运算的结果,Delphi的程序edit控件里的文本则被改写成Param1,Param2 的运算结果。

热心网友 时间:2022-04-13 04:53

首先构建一个需要向回调函数中传入参数的典型应用。在一个页面中产生了一系列的向Ajax Proxy的请求,传入的是一个ID
,根据ID返回了不同的内容值,我们需要把这些内容打印在页面上,同时给页面元素赋予ID
,这个时候就需要向回调函数中传入ID
,以产生带ID的页面元素。
第一种方法就是使用全局变量,能够被函数和回调函数同时访问。这种方法虽然不够优雅,但是确实能够完成任务。
第二种办法是使用Closure
,这种方法更加优雅一些。通过使用Closure
第三种方法假设你需要为你的回调函数使用不同的签名,例如Ajax.Net的专家们允许你在回调中使用额外的参数,如果你想从一个换到另外一个并且保持兼容性的话,就要用到下面的写法:
总结一下:向回调函数中传入参数的终极办法其实就是利用Closure,这个看来是唯一可行而且比较优雅的方法,下面将Closure的写法列在下面:
var callback = {
success:function(data){
var item = document.createElement("li");
item.id = data.id;
item.innerHTML = "The id is : " + data.id;
item.innerHTML += " The value is : " + data.value;
var parent = document.getElementById("result");
parent.appendChild(item);},
failure:function(){
alert('failure:');}}
xhr = new QueuedHandler();
for(var i=0;i<20;i++){
xhr.request('get','ajaxproxy.php?id='+i,function(data){ //第二种办法:利用Closure
data = eval('(' + data + ')');
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
做青红椒炒毛肚有哪些好吃的诀窍? 如何自制好吃的香辣毛肚? 穿越火线警告码SX(2,509,0)如何解决 CF sx警告码(2,770,0)什么原因 ...要求重新启动电脑 警告码是2 xxxx 0 有时重启4 5次才能玩 win7系统... 穿越火线 sx 警告码 2,994,0 怎么解决 CF出现非法模块SX警告码(2,990,0) 我为什么上CF体验服没开G有非法模块???怎么办啊 警告码(2,502,0) 穿越火线进游戏后 2分钟左右 就出来个 SX 警告码2,990,0 看到刘老师那慈祥的面庞,我感慨万分,我想到了这样几个赞美刘老师的成语... 外孙满月请柬怎么写? 外孙女过满月怎么发邀请? airpodspro激活了就不是全新的吧 多形性红斑,怎么治 微信聊天记录无网络备份 评论一下孝感 电信号码如何注销? 孝感316国道外迁什么时候结束 316国道哪年修的 从孝感火车站到孝南经济开发区316国道复线维达纸业怎么坐车 请问316,107国道经过湖北的哪些城市 有什么办法可以彻底治愈“多发性红斑”啊? 孝感碧桂园新城华府周边环境怎么样?生活便利吗? 孝感碧桂园新城华府交通方便吗?应该怎么过去? 从十堰走316国道至孝感多少公里 怎样剥橘子 hario和chemex手冲壶哪个好 孝感市交通违章处理到什么地方去 316国道起点和终点在哪里? 治疗多形红斑的最好方法是什么? 我就是和异性聊天天被我的情人发现了他一直不肯原谅我怎么办 海外版airpods可以激活吗 我和情人昨天闹矛盾了,我向她道歉了,她到现在还是不原谅我咋,我们感情很深,她的心里到底怎么想法 与情人吵架我说话难听伤到他了,可我又一直认错,他为啥一直不理我? 满月酒邀请短信 求助,新入的airpods 使用了几天,还是未激活 恋爱中,我做错了事情,认错了,使劲认错了,还不原谅那我该怎么做?? 孙子一周岁生日邀请短信? 如果我错了,也跟对方道歉了,对方还不原谅怎么办! 向情人吵架道歉错她说这一切都太迟了,她能接受原谅我的错吗?两个人已经断联四个半月了? 恋人之间产生矛盾,男方主动道歉了,可女方还是不理,那该怎么办啊!?? 如果做错了一件事之后,你道歉了但别人还是不原谅你,这时候怎么办 华润微股市历史最高价?华润微和b股票价格不同?华润微为啥就涨不起来? 我都道歉了,为什么对方还不原谅 道歉后,情人还是不原谅,怎么办 我和女朋友吵架了,我作为男人我想她道歉了,可是她还是不原谅我怎么办? 跟男情人严重的事情后,我发信息道歉不原谅我,不回复我信息却下线了是什么意思?不知道他还会不会上线给 如果你多次道歉别人还不原谅你该怎么办? 情人不原谅我该怎么办?我说错了话,他很生气,说在也不理我了怎办? 情人知道错了跟我道歉,我原谅他吗