通用 Thunk
http://tech.ddvip.com 2008年05月25日 社区交流
内容摘要:这篇文章提出了一种基于Thunk技术,让一个成员函数成为一个回调函数的通用方法。文章主要讨论原理,同时也提供了一份实现和示例。
(宏THUNK_MACHINE_CODE_IMPLEMENT没有定义)
在StdToStd.cpp 中,将被替换成: “:POP_EAX(0x58)”
(宏THUNK_MACHINE_CODE_IMPLEMENT 被定义)
在StdToStd.cpp中,宏 CODE_FIRST 于CODE 的不同之处在于 CODE 被替换为 “, 某某” 而不是 “: 某某” .使得初始化列表合法。
宏(macro) STD_TO_STD_CODES() 的注释(comment) 详细说明了这个类是如何工作的。
设计 ThisToCdecl
让我们还是依照那3个步骤分析:
1、当一个使用__cdecl 的普通C函数调用时,编译器从右向左压入参数,我们假设这使得栈增加N。CALL指令将返回地址压栈,使得栈再增加4。
堆栈就像这样:
…
参数 m <- ESP + 4 + N
参数 m-1
…
参数 1 <- ESP + 4
返回地址 <- ESP
它使用 ADD ESP,N 平衡堆栈。
2、当一个和上述C普通函数有同样参数列表,使用__thiscall 的成员函数将要被调用时,它希望参数已经被从右向左压入,而且ECX保存着this指针。
…
参数 m <- ESP + 4 + N
参数 m-1
…
参数 1 <- ESP + 4
返回地址 <- ESP
ECX : this
3、当被调用者返回
它使用 RET N !
所以,我们的工作如下:
在调用成员函数之前,将this指针放入ECX
在成员函数返回后,将ESP设置成一个正确的值
返回到调用者。所以,这个正确的值应该是当调用者执行完ADD ESP,N之后,ESP刚好是被调用者调用前的值。
因为参数数量×4不总是等于N,所以我们不能使用SUB ESP,N来设置ESP(比如参数列表含有double)
来源:vckbase 作者:OwnWaterloo 责编:豆豆技术应用
- VC/VC++按钮设计专题
- VC/VC++ 菜单专题
- VC/VC++ 工具条专题
- VC/VC++ 对话框教程
- VC/VC++ 报表教程
- VC/VC++ 控件
- VC/VC++ GDI
- Visual Studio 2008
- VC/VC++ MFC教程
- VC/VC++ QQ
- VC/VC++ Socket编程
- VC/VC++ 钩子编程
- TangramMini组件应用教程
- VC/VC++ 窗体
- VC/VC++ ADO 教程
- Windows CE 教程
- VC/VC++ DLL(动态链接库)编程
- VC/VC++ PDFlib
- VC与MATLAB编程
- VC/VC++ DirectShow 教程
- VC++入门视频教程
- VC/VC++ COM组件设计与应用
- VC/VC++ ATL
- VC/VC++ WTL
- VC/VC++ 定制调试诊断工具和程序
- VC/VC++ 进程
- VC/VC++ Win32
- VC/VC++ WMI
- VC/VC++ 消息
- 更多VC/VC++专题……