直接调用类成员函数地址
http://tech.ddvip.com 2008年03月27日 社区交流
内容摘要:介绍了如何取成员函数的地址以及调用该地址.
class tt
{
public:
void foo(int x,char c,char *s)//没有指定类型,默认是__thiscall.
{
printf("
m_a=%d, %d,%c,%s
",m_a,x,c,s);
}
int m_a;
};
typedef void (__stdcall *FUNCTYPE)(int x,char c,char *s);//定义对应的非成员函数指针类型,注意指定__stdcall.
tt abc;
abc.m_a = 123;
DWORD ptr;
DWORD This = (DWORD)&abc;
GetMemberFuncAddr_VC6(ptr,tt::foo); //取成员函数地址.
FUNCTYPE fnFooPtr = (FUNCTYPE) ptr;//将函数地址转化为普通函数的指针.
__asm //准备this指针.
{
mov ecx, This;
}
fnFooPtr(5,'a',"7xyz"); //象普通函数一样调用成员函数的地址.
对其它类型的成员函数,我们只要申明一个与原成员函数定义完全类似的普通函数指针,但在参数中最左边加一个void * 参数。代码如下:
class tt 每次都定义一个函数类型并且进行一次强制转化,这个事是比较烦的,能不能将这些操作写成一个函数,然后每次调用是指定函数地址和参数就可以了呢?当然是可以的,并且我已经写了一个这样的函数。
{
public:
void __stdcall foo(int x,char c,char *s)//成员函数指定了__stdcall调用约定.
{
printf("
m_a=%d, %d,%c,%s
",m_a,x,c,s);
}
int m_a;
};
typedef void (__stdcall *FUNCTYPE)(void *This,int x,char c,char *s);//注意多了一个void *参数.
tt abc;
abc.m_a = 123;
DWORD ptr;
GetMemberFuncAddr_VC6(ptr,tt::foo); //取成员函数地址.
FUNCTYPE fnFooPtr = (FUNCTYPE) ptr;//将函数地址转化为普通函数的指针.
fnFooPtr(&abc,5,'a',"7xyz"); //象普通函数一样调用成员函数的地址,注意第一个参数是this指针.
来源:vckbase 作者:南风 责编:豆豆技术应用
- 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++专题……