Posted on 2010-04-01 14:25
Sanxcoo 閱讀(1120)
評論(8) 編輯 收藏 引用
在網(wǎng)上查了一些資料,做了一個(gè)Thunk模板,能夠正確調(diào)用成員函數(shù)。但是在做取成員函數(shù)地址操作時(shí)比較麻煩,需要用到匯編。
//取成員函數(shù)地址
DWORD_PTR off = 0;
_asm
{
mov eax, Class::MemFunc
mov DWORD PTR [off], eax
}
每指定一個(gè)成員函數(shù)作為一個(gè)回調(diào)函數(shù)就要做如上操作。本想將Class和MemFunc作為兩個(gè)參數(shù)定義一個(gè)宏包含匯編語言部分,
但不知道怎樣編寫匯編部分。如果有知道怎么編寫的,希望能不吝賜教^_^
// Thunk 具體實(shí)現(xiàn)
#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, 數(shù)值”的機(jī)器碼
m_thunk.op_movecx = 0xB9;
// 將對象指針pObject賦值給ecx
m_thunk.val_ecx = (DWORD_PTR)pObject;
// 0xE9是“jmp 相對地址”的機(jī)器碼
m_thunk.op_call = 0xE9;
// 利用成員函數(shù)的具體地址pMemFuncAddress計(jì)算jmp的相對地址
m_thunk.val_address = pMemFuncAddress - ((DWORD_PTR)(&m_thunk.val_address) + sizeof(DWORD_PTR));
return (TCallback)&m_thunk;
};
protected:
Thunk_struct m_thunk;
};