Datentyp für eine Funktion



  • Das habe ich jetzt nicht so ganz verstanden... Besonders die letzte Zeile deines Beitrags irritiert mich 😕
    Ich poste hier mal mein altes Programm, vielleicht wird dann klarer, was ich meine:

    #include "windows.h"
    #include <stdio.h>
    
    int _stdcall PrintAnotherShit(DWORD x, DWORD y);
    void SetRecall(DLGPROC* AProc, DWORD x, DWORD y);
    void NotMessage();
    
    int main(int argc, char* argv[])
    {
        printf("Hello world!\n");
        SetRecall((DLGPROC*)PrintAnotherShit, 200, 400);
        return 0;
    }
    
    int __stdcall PrintAnotherShit(DWORD x, DWORD y)
    {
        DWORD db;
        DWORD k;
        __asm{
            mov eax, [ebp+12]
            mov k, eax
    
            mov db, 0xFFF0
            mov eax, db
            xor eax, eax
            jz iszero
    
            jmp end
    
            iszero:
                call NotMessage
    
            end:
        }
        printf("db ist %d\n", db);
        printf("x ist %d\n", x);
        printf("y ist %d\n", y);
        printf("y ist %d\n", k);
        return x*y;
    }
    
    void SetRecall(DLGPROC* AProc, DWORD x, DWORD y)
    {
        DWORD dw;
        __asm {
            push y
            push x
            call AProc
            mov dw, eax
        }
        printf("PrintAnotherShit() gibt %d zurueck\n", dw);
    }
    
    void NotMessage()
    {
        printf("xor db, db ist 0!\n");
    }
    

    [ Dieser Beitrag wurde am 22.03.2003 um 19:24 Uhr von hackbert editiert. ]



  • Was willst du jetzt dazu wissen?



  • Ich will wissen, wodurch ich DLGPROC ersetzen muss, damit ich nicht DLGPROC gebrauchen muss, da diese ja in den windows headern drinne ist und die nicht includet werden sollen.



  • DLGPROC sieht so aus. kannst du ja wohl ganz leicht auf deine funktion ändern

    typedef INT_PTR (CALLBACK* DLGPROC)(HWND, UINT, WPARAM, LPARAM);



  • void SetRecall(int (*foo)(DWORD,DWORD), DWORD x, DWORD y) {
      int dw = foo(x,y)
    }
    

    das _stdcall ist kein ANSI-C, keine Ahnung wo das hinmuß. Versuchsweise würd ichs nach int oder vor foo setzen 😉 Guck dir doch im Zweifelsfall die Deklaration in der windows.h an.

    Damit sollten sich die 2 stinkenden Stellen (cast nach DLGPROC und Calling Convention von Hand) ausmerzen lassen. OT/BTW war nicht stdcall so, dass die Argumente von links nach rechts auf den Stack wandern?



  • __stdcall muss dahin wo CALLBACK steht. aber CALLBACK ist schon __stdcall 🙂



  • Original erstellt von <??>:
    **DLGPROC sieht so aus. kannst du ja wohl ganz leicht auf deine funktion ändern

    typedef INT_PTR (CALLBACK* DLGPROC)(HWND, UINT, WPARAM, LPARAM);**

    hä? Das ist die definition von INT_PTR...



  • Original erstellt von Bashar:
    **
    Damit sollten sich die 2 stinkenden Stellen (cast nach DLGPROC und Calling Convention von Hand) ausmerzen lassen.
    **

    Die Calling Convention von Hand sollte drinne bleiben, die war zu Lernzwecken drin.

    Original erstellt von Bashar:
    **
    OT/BTW war nicht stdcall so, dass die Argumente von links nach rechts auf den Stack wandern?**

    Ja. Wenn dich sowas interessiert, dann schau dir mal das hier an: http://bkausbk.netfirms.com/callconv.html#STDCALL

    Man kann auch das ganze mit long machen:

    void SetRecall(long AProc, DWORD x, DWORD y)
    {
        DWORD dw;
        __asm {
            push y
            push x
            call AProc
            mov dw, eax
        }
        printf("PrintAnotherShit() gibt %d zurueck\n", dw);
    }
    

    [ Dieser Beitrag wurde am 22.03.2003 um 20:47 Uhr von hackbert editiert. ]



  • hä? Das ist die definition von INT_PTR...

    quatsch :o



  • jo, hab mich geirrt! Sorry. Hatte das andersherum gedacht, wenn du weißt was ich meine...



  • wenn du weißt was ich meine...

    ja 🙂 🙂 🙂 🙂



  • hackbert: Öhm ... und warum packst du sie dann von rechts nach links drauf?



  • In dem Text steht doch

    Die Parameter werden auch von rechts nach links auf den Stack kopiert wie bei cdecl.

    Dann wäre das doch richtig, was er gemacht hat? 😕 😕



  • Hab mich verlesen. Die Parameter werden von rechts nach links auf den Stack gelegt, also der letzte Parameter zuerst und der erste zuletzt.


Anmelden zum Antworten