原文链接:http://www.titilima.cn/show-537-1.html
今天的话题比较有意思,如何获取一个非 static 成员函数的指针?考虑以下代码:
-
classA
- {
-
public:
-
voidfoo(void);
- };
-
voidA::foo(void)
- {
-
puts("Hello,World!");
- }
也就是说,如何获取 A::foo 的指针?
那位说了:这有何难?一个 typedef 全搞定!
-
typedefvoid(A::*FooPtr)(void);
- FooPtrfunc=&A::foo;
且慢,我还没说完呢。我要把这个指针用于 thunk 技术,所以我希望得到一个 void* 类型的指针。这样一来,如果再使用一个类型转换的话,那么就会得到一个 C2440 的编译错误,因为 C++ 是强类型的,不允许我们胡作非为。
于是我们只能搞些歪门邪道了,且看:
方案一 汇编
-
void*func=NULL;
- __asm
- {
- pusheax
- leaeax,A::foo
- movfunc,eax
- popeax
- }
优点:效率高,无废话。
缺点:可移植性差。
方案二 stdio
-
void*func=NULL;
-
charaddr[9];
-
sprintf(addr,"%p",&A::foo);
-
sscanf(addr,"%p",&func);
优点:完全可移植。
缺点:效率低,而且有些无厘头。
另外需要指出的是,对于 VC 的 Debug 配置而言,以上的两种方式获取的都不是 A::foo 的真实地址,而是 ILT 的地址。因此如果我们需要的是真实地址的话,还需要另外解析 ILT 表项的代码。
分享到:
相关推荐
主要介绍了C++获取类的成员函数的函数指针详解及实例代码的相关资料,需要的朋友可以参考下
对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用。但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法。C++专门为成员指针准备了三个运算符: "::*"用于...
采用MFC编程时,子对话框常常要向主窗口传递数据,获取主窗口的对象指针便显得非常重要了。 void CMyView::OnModel() //点击菜单,创建对话框的几种变量设置,总共是4种方法,模态的一种,非模态的三种 { // TODO: ...
讲友元之前先讲普通的成员函数的函数指针 <code class=sourceCode>class Std_interface { public: virtual void suspend() = 0; }; // define the pointer of function typedef void (Std_...
C++中回调函数及函数指针的实例详解 如何获取到类中函数指针 实现代码: //A类与B类的定义 ...//定义类的成员函数指针 typedef void (A::*A_mFun)(void); typedef void (B::*B_mFun)(void); int main
2、原理:为了提高代码的安全性,可以采用把把函数名隐藏在结构体里,以函数指针成员的形式存储。 编译后,只留了下地址,去掉了名字和参数表,提高了逆向成本和攻击门槛. 3、应用场景:签名函数
我们都知道C++ class中有三种成员函数,static(静态的),nonstatic(非静态的),virtual(虚拟的)各种成员函数的指针各有差别,下面是一个完整的样例:(注意红颜色的差别) class A { public: static void ...
如果在消息处理中需要文档的数据,应该调用该类的成员函数GetDocument来获取文档对象,然后通过文档对象的接口函数对文档中的数据进行操作. (4) 在CViwe类的派生类中的OnDraw函数中编写窗口重绘时的代码. Gilbert觉得...
分别用来设置和获取学生各个属性值的set()和get()成员函数(例如:设置数学成绩的成员函数setMath().返回数学成绩的成员函数 getMath());计算三门课程总成绩的函数sum();显示学生数据信息的函数print();(注意:...
表 1 unique_ptr指针可调⽤的成员函数 成员函数名 成员函数名 功 功 能 能 operator*() 获取当前 unique_ptr 指针指向的数据。 operator->() 重载 -> 号,当智能指针指向的数据类型为⾃定义的结构体时,通过 -> ...
有三个私有成员变量Hour、Minute、Second,定义构造函数、析构函数以及用于改变、获取、输出时间信息的公有函数,主函数中定义时间对象,并通过调用各种成员函数完成时间的设定、改变、获取、输出等功能。...
【题目】显示宠物信息。具体要求如下: (1)定义抽象宠物类Pet: 数据成员(protected): char name[20];...(4)编写主函数对所定义的类进行测试,要求每个成员函数均要测试到,测试数据自定。
表 1 unique_ptr指针可调⽤的成员函数 成员函数名 成员函数名 功 功 能 能 operator*() 获取当前 unique_ptr 指针指向的数据。 operator->() 重载 -> 号,当智能指针指向的数据类型为⾃定义的结构体时,通过 -> ...
表 1 unique_ptr指针可调⽤的成员函数 成员函数名 成员函数名 功 功 能 能 operator*() 获取当前 unique_ptr 指针指向的数据。 operator->() 重载 -> 号,当智能指针指向的数据类型为⾃定义的结构体时,通过 -> ...
// 对类型void特化 成员函数: (1) : 获得内部对象的指针; (2) :释放被管理对象的所有权,将内部指针置为空,返回内部对象的指针,此指针需要⼿动释放; (3) :销毁内部对象并接受新的对象的所有权; (4) :从...
本源码演示如何利用VC++对话框类的成员函数向控件发送消息和获取对话框控件的类指针,以及如何直接利用对话框控件类操纵对话框控件(发送消息和直接调用成员函数)、如何在程序运行时产生和销毁控件。对话框控件的...
QSharedPointer成员属性⽐较简洁代码段@1声明成员属性value(需要管理的裸指针), 代码段@2声明属性d。Data类型我们从第1点中可 知为QtSharedPointer::ExternalRefCountData 的类型别名。主要作⽤为记录当前持有value...
链表结点类中包含私有数据成员为两个整数x,y以及左结点指针left及右结点指针right。 包含的函数成员包括: (a)对结点的数据成员赋值setDNodeValues(int,int,DNode* leftP=NULL, DNode* rightP=NULL); (b)链表左插入...