Funktionspointer (typedef) falsch ? Probleme mit __thiscall



  • Hi.

    typedef char* (__thiscall *GetTextPtr)(void* object, char* _var, DWORD_PTR junk);
    

    Was ist daran falsch ? Der Compiler (MinGW) mäkelt wie folgt:

    main.cpp|9|error: expected `)' before '' token|
    main.cpp|9|error: expected initializer before '
    ' token|

    Mit _cdecl und anderen Calling Conventions hab ich keine Probleme 😕

    Außerdem weiß ich dass der Code mit anderen Compilern so übersetzt werden kann, mal wieder eine gcc-Macke oder sind die anderen Compiler nicht Standard-konform ?

    Danke schon mal 🙂

    Grüße,
    Flo





  • theta schrieb:

    __thiscall ist MS spezifisch:
    http://msdn.microsoft.com/en-us/library/ek8tkfbw.aspx

    Danke für die Antwort. 🙂
    Was wäre ein gcc Äquivalent um mit THISCALL - Calls zu arbeiten ?



  • Ich entschuldige mich für den Doppelpost.

    Also, ich hab mir jetzt extra VC++ geladen um den Mist zu kompilieren.

    Ergebnis:

    main.cpp(8) : error C2143: Syntaxfehler: Es fehlt ')' vor ''
    main.cpp(8) : error C2143: Syntaxfehler: Es fehlt ';' vor '
    '
    main.cpp(8) : error C2059: Syntaxfehler: ')'
    main.cpp(8) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.

    Kann mir jemand bitte etwas Nachhilfe geben? 🙂

    Aber dass thiscall MS-spezifisch ist stimmt doch nicht?
    Ist doch Standard bei C++-Calls, Pointer auf das Object kommt nach ECX, Argumente werden gepushed, Funktion wird aufgerufen, Rückgabewert wandert nach EAX....



  • nicht die technologie - aber das makro vll ^^

    das, was du damit vorhast sieht allerdings so aus, als ob es nicht klappen würde... ^^ erklär es vll mal kurz!?

    bb



  • Ist doch Standard bei C++-Calls, Pointer auf das Object kommt nach ECX, Argumente werden gepushed, Funktion wird aufgerufen, Rückgabewert wandert nach EAX....

    Es ist üblich auf x86 Hardware, aber soweit ich weiss kein Standard.

    Das hat aber mit der Syntax die du da verwenden willst um einen Typedef auf einen Member-Function-Pointer-Typ zu setzen nix zu tun.
    Die ich im Übrigen so auch noch nie gesehen habe.

    Wo hast du denn die Zeile her? Und steht da im Original auch "void* object", oder vielleicht doch ein Typ?



  • unskilled schrieb:

    nicht die technologie - aber das makro vll ^^

    das, was du damit vorhast sieht allerdings so aus, als ob es nicht klappen würde... ^^ erklär es vll mal kurz!?

    bb

    Es geht um das ausführen eines Calls in einem fremdem Prozess.

    Mit dem Debugger die Adresse die "gecalled" wird rausgesucht, als THISCALL identifiziert.

    Nachdem das Funktionsgerüst steht, möchte ich die Funktionsaddresse zuweisen:

    GetTextPtr GetText = reinterpret_cast<GetTextPtr>(0xDEADBEEF);

    Ich habe eine Struktur gefunden, die das Objekt enthält das ich verwenden möchte.

    Also möchte ich die Adresse des Objekts aus dieser Struktur fischen (was kein Problem ist) und als ersten Parameter übergeben damit es nach ECX kommt. Die restlichen 2 Argumente werden danach übergeben.

    Der Code befindet sich in einer DLL die ich in den Speicher des Prozesses lade.

    Ohne jetzt weiter auf Windows auszuschweifen 😉

    Wo hast du denn die Zeile her? Und steht da im Original auch "void* object", oder vielleicht doch ein Typ?

    Hab den Code alleine getippt, hatte die Probleme, kurz gegoogled, ähnlichen Source gefunden der kompiliert beilag. Muss also funktionieren.

    Und ich wüsste nicht wie ich die Adresse eines Objektes übergeben könnte dessen Typ ich nicht direkt kenne außer über einen Voidpointer. 😉

    Grüße,
    Flo



  • um herauszufinden welches sternchen er meint mach doch mal nach jedem sternchen eine neue zeile 🙂



  • Icematix schrieb:

    Wo hast du denn die Zeile her? Und steht da im Original auch "void* object", oder vielleicht doch ein Typ?

    Hab den Code alleine getippt, hatte die Probleme, kurz gegoogled, ähnlichen Source gefunden der kompiliert beilag. Muss also funktionieren.

    Und ich wüsste nicht wie ich die Adresse eines Objektes übergeben könnte dessen Typ ich nicht direkt kenne außer über einen Voidpointer. 😉

    Wie sieht denn der "ähnliche" Source aus, der funktioniert?

    Ansonsten: du solltest wohl besser "Interfaces" (abstrakte Basisklassen) verwenden.


Anmelden zum Antworten