为什么成员函数指针不能转换为void*?
void *pVoid = (void*)(&CTest::SomeFun);
error C2440: “类型转换”: 无法从“bool (__thiscall CTest::* )(void)”转换为“void *”
编译器为什么禁止这样的转换?我的环境是VC2008。上网找了一下,看到一个链接——
http://www.cnblogs.com/codingmylife/archive/2011/03/08/1976720.html
里面的楼主提到一句话:“成员函数指针与void*指针长度可能不同,不能随意转。”真的是这样么?我的理解,Win32系统里,所有的指针都是4个字节长吧?
成员函数指针不能转换为void*的真正原因是什么呢?
[解决办法]
有时间去看看 c++必知必会 关于成员函数指针那个专题吧。你就知道为什么了。
[解决办法]
有一个东西叫boost,function+bind库。
[解决办法]
可以转换的,只是编译器限制不许你转换而已
看这个
template <typename to,typename from>
void cvt_ptr(from f,to& t)
{
union
{
from _f;
to _t;
}ut;
ut._f = f;
t = ut._t;
}
这段代码用于winproc jmp 至成员函数处理。
win32或者wow64运行正常. 64位编译可能需要修改机器码和指针长度
LPBYTEpAsm=(LPBYTE)VirtualAlloc(NULL,128,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
assert(pAsm);
pAsm[0]=0xb9;
*(LPDWORD)(pAsm+1)=(DWORD)(LPVOID)this;
pAsm[5]=0xb8;
cvt_ptr(&GWindow::WinProc,*(LPDWORD)(pAsm+6));
pAsm[10]=0xff;
pAsm[11]=0xe0;
pWinProc=pAsm;