在网上查了一些资料,做了一个Thunk模板,能够正确调用成员函数。但是在做取成员函数地址操作时比较麻烦,需要用到汇编。
//取成员函数地址
DWORD_PTR off = 0;
_asm
{
mov eax, Class::MemFunc
mov DWORD PTR [off], eax
}
每指定一个成员函数作为一个回调函数就要做如上操作。本想将Class和MemFunc作为两个参数定义一个宏包含汇编语言部分,
但不知道怎样编写汇编部分。如果有知道怎么编写的,希望能不吝赐教^_^
// Thunk 具体实现
#pragma pack( push, 1 )
struct Thunk_struct
{
BYTE op_movecx; // as operation "mov" in asm
DWORD_PTR val_ecx;
BYTE op_call; // as operation "jmp" in asm
DWORD_PTR val_address;
};
#pragma pack( pop )
template < class TCallback, class TClass >
class Thunk
{
public:
TCallback MemFuncToCallback( TClass* pObject, DWORD_PTR pMemFuncAddress )
{
// 0xB9是“mov ecx, 数值”的机器码
m_thunk.op_movecx = 0xB9;
// 将对象指针pObject赋值给ecx
m_thunk.val_ecx = (DWORD_PTR)pObject;
// 0xE9是“jmp 相对地址”的机器码
m_thunk.op_call = 0xE9;
// 利用成员函数的具体地址pMemFuncAddress计算jmp的相对地址
m_thunk.val_address = pMemFuncAddress - ((DWORD_PTR)(&m_thunk.val_address) + sizeof(DWORD_PTR));
return (TCallback)&m_thunk;
};
protected:
Thunk_struct m_thunk;
};