一种为静态回调函数添加动态参数的方法及相关实现技术

技术编号:3855142 阅读:634 留言:0更新日期:2012-04-11 18:40
本发明专利技术公开了一种为静态回调函数添加动态参数的方法及相关实现,用于解决无法为静态回调函数添加动态参数的技术缺陷;本发明专利技术在原始回调函数的参数列表中添加一个或多个参数,通过参数注入代码将新添的参数和新回调函数的地址压入堆栈,在调用新的回调函数时,将参数注入代码段地址作为回调函数的入口地址,操作系统会在调用时首先执行参数注入代码,然后在参数注入代码段执行完毕后将新的回调函数地址返回给调用函数,在新的回调函数内部可正常使用通过参数代码段注入的动态参数。本发明专利技术使得开发人员可自由的向静态回调函数中传递参数,大大提高了编程的灵活性。

【技术实现步骤摘要】

本专利技术涉及软件开发
,尤其涉及一种为静态回调函数添加动态参数的方法及相关实现
技术介绍
很多系统中通过静态回调函数来向外部通知系统内部的运算结果,或通过静态 回调函数来在系统内部执行用户自定义的操作。在程序中,开发人员会经常定义和使用 静态回调函数,在某些场景下,开发人员会希望向静态回调函数中传递动态的参数,但 系统并没有为开发人员提供相应的方法。通常的做法是采用一些特殊的标识(id)映射方 法,例如在窗体的静态回调函数中,通常采用窗体句柄的唯一性建立映射关系,通过 id映射时,取出映射关系的映射计算是需要消耗计算资源,而且映射关系一般采用全局 变量或模块来实现,全局变量和模块会使得系统复杂度上升。 在〔++语言中,通常实现计时器(timer)类的方法有3种采用窗体建立timer函 数,对timer函数进行封装从而实现timer类;采用一个线程独立计数来实现timer类;采 用timerid映射的方法来实现timer类。上述实现方法的缺陷是,采用窗体方式需要创建 窗体,有系统消耗;采用独立线程方式系统资源消耗更大,而且实现过程复杂; 在C++语言中,把窗体静态回调函数映射到动态的对象的方法(子类化窗体)有 两种实现方案 一种是采用MAP映射的方法(微软MFC就是采用的该方法),该方法 用一个map表保存窗体句柄和对象this指针的映射关系,在窗体事件函数中,凭借窗体 句柄的唯一性取出映射的对象this指针;另一种是通过窗体的SetWindowLong(hWnd, GWLJJSERDATA, (LONG)this)函数来保存窗体对应的对象this指针,窗体事件函数中 再用GetWindowLong(hWnd, GWLJJSERDATA)取出this指针。上述方法的缺陷 是第一种方法中的采用map映射,需要辅助的map映射实现,效率会受到影响。第 二种方法的效率影响不大,但是只要知道hWnd的值的就可以改写GWLJJSERDATA数 据,数据安全没有保证。
技术实现思路
有鉴于此,本专利技术的目的之一提供一种为静态回调函数添加动态参数的方法及 相关实现,用于解决无法为静态回调函数添加动态参数的技术缺陷,为达到上述目的, 本专利技术的技术方案是这样实现的 —种为静态回调函数添加动态参数的方法,包括 在原始回调函数的基础上定义新的回调函数,在新的回调函数中添加动态参 数; 在回调函数使用者调用所述新的回调函数时,通过执行参数注入代码,在新的 回调函数执行之前,将添加的动态参数压入到堆栈中,在新的回调函数执行时,从堆栈 中获取所述添加的动态参数,将其作为有效参数进行使用。4CN 进一步地,所述方法具体为 步骤A1、在原始回调函数的基础上定义新的回调函数,在新的回调函数的参数 列表中添加所述动态参数; 步骤A2、建立参数注入代码,在参数注入代码中通过汇编代码将添加的动态参 数压入堆栈,并把新的回调函数的地址也压入堆栈; 步骤A3、将参数注入代码段地址作为系统调用新的回调函数的函数地址入口, 在系统调用所述新的回调函数时,首先执行所述参数注入代码段,然后再执行所述新的 回调函数。 进一步地,所述动态参数的个数为一个或多个。基于上述方法,本专利技术还提出一种定时器类的实现方法,包括在原始定时器(timer)回调函数的基础上定义新的定时器回调函数,在新的定时器回调函数中添加当前类对象的指针(this); 在定时器回调函数使用者调用所述新的定时器回调函数时,通过执行参数注入 代码,在所述新的定时器回调函数执行之前,将当前类对象的指针作为参数压入到堆栈 中,在所述新的定时器回调函数执行时,从堆栈中获取所述当前类对象的指针,将其作 为有效参数进行使用。 进一步地,所述定时器类的实现方法具体为 步骤B1、在原始定时器回调函数的基础上定义新的定时器回调函数,在新的定 时器回调函数的参数列表中添加所述当前类对象的指针; 步骤B2、建立参数注入代码,在参数注入代码中通过汇编代码将添加的当前类对象的指针作为参数压入堆栈,并把新的定时器回调函数的地址也压入堆栈; 步骤B3、将参数注入代码段地址作为系统调用新的定时器回调函数的函数地址入口,在系统调用所述新的定时器回调函数时,首先执行所述参数注入代码段,然后再执行所述新的定时器回调函数。 进一步地,步骤B1中,除在新的定时器回调函数的参数列表中添加当前类对象 的指针外,还可添加其它动态参数,相应地,在步骤B2中,所述参数注入代码将当前类 对象的指针及其它动态参数依次压入堆栈。 基于上述方法,本专利技术还提出一种窗体子类化的方法,包括 在原始窗体事件回调函数的基础上定义新的窗体事件回调函数,在新的窗体事件回调函数中添加当前类对象的指针(this); 在窗体事件回调函数使用者调用窗体事件回调函数时,通过执行参数注入代 码,在所述新的窗体事件回调函数执行之前,将当前类对象的指针(this)作为参数压入到 堆栈中,在所述新的窗体事件回调函数执行时,从堆栈中获取所述当前类对象的指针, 将其作为有效参数进行使用。 —步地,所述窗体子类化的方法具体为 步骤C1、在原始窗体事件回调函数的基础上定义新的窗体事件回调函数,在新 的窗体事件回调函数的参数列表中添加所述当前类对象的指针; 步骤C2、建立参数注入代码,在参数注入代码中通过汇编代码将添加的当前类 对象的指针作为参数压入堆栈,并把新的窗体事件回调函数的地址也压入堆栈; 步骤C3、将参数注入代码段地址作为系统调用新的窗体事件回调函数的函数地 址入口,在系统调用所述新的窗体事件回调函数时,首先执行所述参数注入代码段,然 后再执行所述新的窗体事件回调函数。 进一步地,步骤C1中,除在新的窗体事件回调函数的参数列表中添加当前类对 象的指针外,还可添加其它动态参数,相应地,在步骤C2中,所述参数注入代码将当前 类对象的指针及其它动态参数依次压入堆栈。 本专利技术在原始回调函数的参数列表中添加一个或多个参数,通过参数注入代码 将新添的参数和新回调函数的地址压入堆栈,在调用新的回调函数时,将参数注入代码 段地址作为回调函数的入口地址,操作系统会在调用时首先执行参数注入代码,然后在 参数注入代码段执行完毕后将新的回调函数地址返回给调用函数,在新的回调函数内部 可正常使用通过参数代码段注入的动态参数。本专利技术使得开发人员可自由的向静态回调 函数中传递参数,大大提高了编程的灵活性。附图说明 图1为本专利技术实施例1的为静态回调函数添加动态参数的方法的流程图。 具体实施例方式本专利技术其基本原理是在原始回调函数的基础上定义新的回调函数,在新的回 调函数中添加动态参数,在回调函数使用者调用所述新的回调函数时,通过执行参数注 入代码,在新的回调函数执行之前,将添加的动态参数压入到堆栈中,在新的回调函数 执行时,从堆栈中获取所述添加的动态参数,将其作为有效参数进行使用。通过本发 明,可在回调函数的调用者保持不变的情况下,向静态回调函数添加动态的参数。 为使本专利技术的目的、技术方案和优点更加清楚明白,以下举实施例并参照附 图,对本专利技术进一步详细说明。 实施例1 : 在采用本专利技术传递动态参数的方法之前,原始回调函数类型的定义为 typedefDWORD(CALLBACK*MYP本文档来自技高网
...

【技术保护点】
一种为静态回调函数添加动态参数的方法,其特征在于,包括:  在原始回调函数的基础上定义新的回调函数,在新的回调函数中添加动态参数;  在回调函数使用者调用所述新的回调函数时,通过执行参数注入代码,在新的回调函数执行之前,将添加的动态参数压入到堆栈中,在新的回调函数执行时,从堆栈中获取所述添加的动态参数,将其作为有效参数进行使用。

【技术特征摘要】

【专利技术属性】
技术研发人员:黄朝兴
申请(专利权)人:腾讯科技深圳有限公司
类型:发明
国别省市:94[]

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1