`
ijavagos
  • 浏览: 1191155 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

获取成员函数的指针

阅读更多

原文链接:http://www.titilima.cn/show-537-1.html

今天的话题比较有意思,如何获取一个非 static 成员函数的指针?考虑以下代码:

  1. classA
  2. {
  3. public:
  4. voidfoo(void);
  5. };
  6. voidA::foo(void)
  7. {
  8. puts("Hello,World!");
  9. }

也就是说,如何获取 A::foo 的指针?

那位说了:这有何难?一个 typedef 全搞定!

  1. typedefvoid(A::*FooPtr)(void);
  2. FooPtrfunc=&A::foo;

且慢,我还没说完呢。我要把这个指针用于 thunk 技术,所以我希望得到一个 void* 类型的指针。这样一来,如果再使用一个类型转换的话,那么就会得到一个 C2440 的编译错误,因为 C++ 是强类型的,不允许我们胡作非为。

于是我们只能搞些歪门邪道了,且看:

方案一 汇编

  1. void*func=NULL;
  2. __asm
  3. {
  4. pusheax
  5. leaeax,A::foo
  6. movfunc,eax
  7. popeax
  8. }

优点:效率高,无废话。

缺点:可移植性差。

方案二 stdio

  1. void*func=NULL;
  2. charaddr[9];
  3. sprintf(addr,"%p",&A::foo);
  4. sscanf(addr,"%p",&func);

优点:完全可移植。

缺点:效率低,而且有些无厘头。

另外需要指出的是,对于 VC 的 Debug 配置而言,以上的两种方式获取的都不是 A::foo 的真实地址,而是 ILT 的地址。因此如果我们需要的是真实地址的话,还需要另外解析 ILT 表项的代码。

分享到:
评论

相关推荐

    C++获取类的成员函数的函数指针详解及实例代码

    主要介绍了C++获取类的成员函数的函数指针详解及实例代码的相关资料,需要的朋友可以参考下

    直接调用类成员函数地址

    对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用。但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法。C++专门为成员指针准备了三个运算符: "::*"用于...

    模态对话框获取主窗口指针

    采用MFC编程时,子对话框常常要向主窗口传递数据,获取主窗口的对象指针便显得非常重要了。 void CMyView::OnModel() //点击菜单,创建对话框的几种变量设置,总共是4种方法,模态的一种,非模态的三种 { // TODO: ...

    C++ 友元函数的函数指针

     讲友元之前先讲普通的成员函数的函数指针  <code class=sourceCode>class Std_interface {  public:  virtual void suspend() = 0;  };  // define the pointer of function  typedef void (Std_...

    C++中回调函数及函数指针的实例详解

    C++中回调函数及函数指针的实例详解 如何获取到类中函数指针 实现代码: //A类与B类的定义 ...//定义类的成员函数指针 typedef void (A::*A_mFun)(void); typedef void (B::*B_mFun)(void); int main

    iOS安全之敏感逻辑的保护方案【把函数名隐藏在结构体里,以函数指针成员的形式存储】案例:js根据key从本地方法获取设备及签名信息 (完整demo)

    2、原理:为了提高代码的安全性,可以采用把把函数名隐藏在结构体里,以函数指针成员的形式存储。 编译后,只留了下地址,去掉了名字和参数表,提高了逆向成本和攻击门槛. 3、应用场景:签名函数

    C++中怎样获取类成员的指针

    我们都知道C++ class中有三种成员函数,static(静态的),nonstatic(非静态的),virtual(虚拟的)各种成员函数的指针各有差别,下面是一个完整的样例:(注意红颜色的差别) class A { public: static void ...

    MFC常用的类及其成员函数简介

    如果在消息处理中需要文档的数据,应该调用该类的成员函数GetDocument来获取文档对象,然后通过文档对象的接口函数对文档中的数据进行操作. (4) 在CViwe类的派生类中的OnDraw函数中编写窗口重绘时的代码. Gilbert觉得...

    设计一个学生类Student(学生学号、姓名、数学、英语、计算机成绩;)

    分别用来设置和获取学生各个属性值的set()和get()成员函数(例如:设置数学成绩的成员函数setMath().返回数学成绩的成员函数 getMath());计算三门课程总成绩的函数sum();显示学生数据信息的函数print();(注意:...

    C++智能指针-unique-ptr智能指针详解.pdf

    表 1 unique_ptr指针可调⽤的成员函数 成员函数名 成员函数名 功 功 能 能 operator*() 获取当前 unique_ptr 指针指向的数据。 operator->() 重载 -> 号,当智能指针指向的数据类型为⾃定义的结构体时,通过 -> ...

    C++实验三.docx

    有三个私有成员变量Hour、Minute、Second,定义构造函数、析构函数以及用于改变、获取、输出时间信息的公有函数,主函数中定义时间对象,并通过调用各种成员函数完成时间的设定、改变、获取、输出等功能。...

    题目:显示宠物信息(Dev C++运行可通过但是会警告)(纯虚函数、父类指针、动态多态性、继承)

    【题目】显示宠物信息。具体要求如下: (1)定义抽象宠物类Pet: 数据成员(protected): char name[20];...(4)编写主函数对所定义的类进行测试,要求每个成员函数均要测试到,测试数据自定。

    C++11unique-ptr智能指针详解.pdf

    表 1 unique_ptr指针可调⽤的成员函数 成员函数名 成员函数名 功 功 能 能 operator*() 获取当前 unique_ptr 指针指向的数据。 operator->() 重载 -> 号,当智能指针指向的数据类型为⾃定义的结构体时,通过 -> ...

    C++11unique-ptr智能指针详解(1).pdf

    表 1 unique_ptr指针可调⽤的成员函数 成员函数名 成员函数名 功 功 能 能 operator*() 获取当前 unique_ptr 指针指向的数据。 operator->() 重载 -> 号,当智能指针指向的数据类型为⾃定义的结构体时,通过 -> ...

    C++智能指针的原理和实现.pdf

    // 对类型void特化 成员函数: (1) : 获得内部对象的指针; (2) :释放被管理对象的所有权,将内部指针置为空,返回内部对象的指针,此指针需要⼿动释放; (3) :销毁内部对象并接受新的对象的所有权; (4) :从...

    VC++用对话框控件发消息、获取控件指针

     本源码演示如何利用VC++对话框类的成员函数向控件发送消息和获取对话框控件的类指针,以及如何直接利用对话框控件类操纵对话框控件(发送消息和直接调用成员函数)、如何在程序运行时产生和销毁控件。对话框控件的...

    Qt源码剖析-智能指针.pdf

    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)链表左插入...

Global site tag (gtag.js) - Google Analytics