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::GetAinline

クラス メンバー関数をそのクラス内で完全に定義するか、プロトタイプのみを含めて後でその定義を含めるかの唯一の違いは、最初の場合、関数はコンパイラによって自動的にインライン メンバー関数と見なされるのに対し、2 番目の場合はインライン メンバー関数と見なされることです。通常の (インラインではない) クラスメンバー関数であり、実際には動作に違いはないと想定されます。

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 に答える