在C++实现回调(续)
来源:互联网 发布:java中自定义异常类 编辑:程序博客网 时间:2024/05/22 00:09
Method6:使用类的非静态函数作为回调(采用thunk的方法2)
在上面的实现过程中,可以看出来主要的部分就是这里:
bMovEcx = 0xB9;
dwThis = (DWORD)pThis;
bJmp = 0xE9;
dwRealProc = DWORD((INT_PTR)proc - ((INT_PTR)this+sizeof(THUNK)));
意思就是Move Ecx pThis; 即把this指针保存到了ECX的寄存器,JMP dwRealProc;就是跳转到成员函数的地址并进行调用。
对于调用类的非静态方法时中需要传入this指针的问题,我们再找一种方法进行解决,上面的类方法使用的是默认的thiscall的调用规则,下面我们使用stdcall的方式,也就是不使用ecx传递this指针,而直接使用栈进行this指针的传递。见代码:
这里我们使用stdcall的约定定义函数方法,在调用的过程中在函数的参数列表的最左端添入一个this指针参数,也就是在栈的最下面,函数返回值之前加入this指针,达到可以调用的目的。
Method7:使用类的非静态函数作为回调(采用直接调用虚函数的方法)
其实这种方法跟上面的也类似,规避this指针的方法也是采用嵌入汇编的方式,将this指针赋值到ecx中。不过就是获取函数地址的方法有点不同了,上面都是使用pointer_cast<int>(&Test::Test2)这种方法,直接转化类的方法,这次我们将类函数的写成虚函数,通过虚函数表获取函数地址,进行调用。
PS:上面的代码中使用了两种方法获取函数的地址,好好琢磨一下吧~
Method8:使用类的非静态函数作为回调(采用成员函数指针的方法) 使用成员函数指针,不过这个弄的有点不像回调了,仅供参考吧:
Method9:使用类的非静态函数作为回调(采用FastDelegate)
很多大牛们早就开始研究这个问题了,解决方法也有很多,FastDelegate就是一个,可以参看下面的网址:
http://www.codeproject.com/KB/cpp/FastDelegate.aspx
当然中译本也有了,搜一下“成员函数指针与高性能的C++委托”就可以了,不多说了。
Method10:使用类的非静态函数作为回调(采用Tr1::function + bind)
C++ Technical Report 1 (TR1)是ISO/IEC TR 19768, C++ Library Extensions(函式库扩充)的一般名称。TR1是一份文件,内容提出了对C++标准函式库的追加项目。这些追加项目包括了正则表达式、智能指针、哈希表、随机数生成器等。TR1自己并非标准,他是一份草稿文件。然而他所提出的项目很有可能成为下次的官方标准。这份文件的目标在于「为扩充的C++标准函式库建立更为广泛的现成实作品」。
C++ tr1是针对C++标准库的第一次扩展。即将到来的下一个版本的C++标准c++0x会包括它,以及一些语言本身的扩充。tr1包括大家期待已久的smart pointer,正则表达式以及其他一些支持范型编程的东东。草案阶段,新增的类和模板的名字空间是std::tr1。
这个没怎么研究过,先列到这里,以后再慢慢研究~~
Method11:使用类的非静态函数作为回调(采用Boost::Function + bind)
BOOST库接触的比较少,也不敢多说啥,看到网上写的供给回调的方案有下面几种吧
Boost::Function + bind
Boost::Functor + Signal/Slot
Boost::lamda
大家可以研究一下,这个也以后再细细的说吧~
PS:大家可以看看下面的这个博客,讨论了一下各种方法的速度,没有具体考察过,大家权作参考吧~
http://www.cppblog.com/oldworm/archive/2011/01/30/139610.html
方法太多了,用的场合也多种多样,还要细细的研究啊~
回调,To be, or not to be...
- 如何在C和C++中实现回调
- 如何在C和C++中实现回调
- 在C + +实现
- 在C++实现回调(续)
- 在C++实现回调(续)
- C语言实现回调
- 在C++实现回调
- 在C++实现回调
- 在C++实现回调
- 在C++Builder下实现FTP断点续传
- 在c#中实现3层架构
- C#在实现分割、合并器
- 在程序中实现自动升级(C#)
- URLDecode 和 URLEncode 在 C 中的实现
- 在C#中如何实现回车
- 如何在C#中实现继承?
- Callback在C/C++中的实现
- 在C中实现矩阵运算
- UltraEdit不高亮解决办法
- InternetReadFile这个函数带来的网络断开无法返回的问题
- ZOJ 2095 数论,因子之和
- 移动创业风向标:Apple 2010年度移动应用榜单
- 阿里巴巴核心业务系统数据库平台迁移: Oracle -> MySQL 停机时间控制在10分钟之内
- 在C++实现回调(续)
- Cannot modify header information - headers already sent by
- Zen cart后台管理账号密码忘记怎么办
- Arm-linux-gcc安装
- Java读取文件中含有中文的解决办法
- 增量日志迭代同步和阿基里斯悖论
- JavaScript自动点击链接 防止绕过浏览器访问
- Ubuntu 8.04下编译Android源码全过程
- KB和Kib 关于字节(byte/B)的进制问题