0

假设我有一堂课:(对不起另一个问题,嗯)

class myClass
{
private:
   int a;
public:
   int GetA() { return a; }
};

如果GetA()可能通常在 cpp 上定义,int myClass::GetA() { return a; } 我可以调试它并找到该函数的地址,但由于它在类中定义,我不能这样做。

在真正的问题中,我想知道它的地址,GetDirection()但正如您所见,它没有任何地址,我尝试搜索调用它的指针,但没有任何汇编call指令

在此处输入图像描述

如果它是在课堂之外定义的,我会这样做:

int callGetAFunction( DWORD* pointerToThatClass )
{
    int retMe;
    __asm
    {
        mov ecx, pointerToThatClass
        mov eax, 0x00427110 //example address of myClass::GetA()
        call eax
        mov retMe, eax
    }
    return retMe;
}

现在我有了指向那个类的指针,但是没有GetA()方法的地址,因为它是用它定义的,那我怎么能调用GetA()方法呢?(实际指针是在 dll 上检索的,我试图GetA()从那里调用)

int main()
{
  void* pClass = FunctionThatReturnsAPointerToAMyClassObject();
}
4

3 回答 3

2

我不确定我明白你的意思。addressof ( &) 运算符怎么样?

int (myClass::*ptr)() = &myClass::GetA;

myClass obj(42); // or however you construct the object
cout << (obj.*ptr)() << endl;
于 2013-06-23T04:38:34.263 回答
1

你不能取它已经编译时的内存地址myClass::GetA,因为它被认为是inline.

完全在其类中定义类成员函数或仅包含原型及其定义之间的唯一区别是,在第一种情况下,编译器将自动将函数视为内联成员函数,而在第二种情况下,它将是一个普通的(非内联的)类成员函数,它实际上假设行为没有区别。

http://www.cplusplus.com/doc/tutorial/classes/中所述。

于 2013-06-23T04:46:27.967 回答
0

为什么不简单地:

int main () {
    MyClass * p = functionThatReturnAMyClassObj ();
    p->getA ();
}

?

于 2013-06-23T04:38:04.920 回答