65,186
社区成员




#define FAKE_THSI 0x00000000
#define FAKE_MBFUNCTION 0x00000000
struct TempClass
{};
typedef void(TempClass::* LPTHISCALLPTR)(int);
void Foo()
{
TempClass * pFakeThis = FAKE_THSI;
LPTHISCALLPTR pFakeMember = FAKE_MBFUNCTION; //在这里,如何用非NULL值对其初始化 或者之后对其赋值?
// 以下转换全部失败
//pFakeMember = LPTHISCALLPTR(1); //Error
//pFakeMember = (LPTHISCALLPTR)1; //Error
//pFakeMember = static_cast<LPTHISCALLPTR>(1); //Error
//pFakeMember = reinterpre_cast<LPTHISCALLPTR>(1); //Error
//我用的替代方法:
FillPtr(pFakeMember,(void*)1);
// 用特别指定的地址来构成 thiscall 调用,包括this指针和成员函数地址都被强制指定
(pFakeThis->*pFakeMember)(0);
}
void FillPtr(void * pDest, void * SpecAddr)
{
*(void**)pDest = SpecAddr;
}
#define FAKE_THSI 0x00000000
#define FAKE_MBFUNCTION 0x00000000
struct TempClass
{};
typedef void(TempClass::* LPTHISCALLPTR)(int);
void FillPtr(void ** pDest, void * SpecAddr)//
{
*(void**)pDest = SpecAddr;
}
void Foo()
{
TempClass * pFakeThis = FAKE_THSI;
LPTHISCALLPTR pFakeMember = FAKE_MBFUNCTION; //在这里,如何用非NULL值对其初始化 或者之后对其赋值?
// 以下转换全部失败
//pFakeMember = LPTHISCALLPTR(1); //Error
//pFakeMember = (LPTHISCALLPTR)1; //Error
//pFakeMember = static_cast<LPTHISCALLPTR>(1); //Error
//pFakeMember = reinterpre_cast<LPTHISCALLPTR>(1); //Error
//我用的替代方法:
FillPtr((void**)&pFakeMember,(void*)1);
// 用特别指定的地址来构成 thiscall 调用,包括this指针和成员函数地址都被强制指定
(pFakeThis->*pFakeMember)(0);
}