Funktionen aus Libraries über Funktionszeiger aufrufen



  • Hallo, ich versuche DLL-Funktionen über Funktionszeiger aufzurufen,
    benutze hierbei die Funktionen LoadLibrary und GetProcAddress.
    Ich hab auch schon einen Weg gefunden, diese Funktionen aufzurufen, mein Code sieht so aus:

    typedef long (*Funktionszeiger) (long, long);
    
    int main()
    {
        Funktionszeiger Zeiger;
        HMODULE hMyDLL = LoadLibrary ("C:\\TestDLL.dll");
        Zeiger = (Funktionszeiger) GetProcAddress (hMyDLL, "Exec_deLuxe");
    
        long g = Zega(2, 5);
        return 0;
    }
    

    Nur leider ist für mich vollkommen unverständlich, warum man einen Funktionszeiger wie eine Variable behandeln kann . Typedef ist mir in dem Zusammenhang total fremd. Ich habe den Umgang mit Funktionszeigern nämlich so gelernt: (aus dem Buch: "Einstieg in C++" von Arnold Willemer)
    Es steht zum Beispiel drin, dass Funktionszeiger so deklariert werden:

    tBaum * (*Funktionszeiger) (tBaum *, int);
    

    Und die Adresse wird dann so zugewiesen:

    Funktionszeiger = Funktionsname;
    

    Aber warum wird es laut MSDN mit typedef gehandhabt ? Warum kann ich scheinbar (sollte ich es annähernd verstanden haben) die Funktionsdeklaration wie eine Variable benutzen ? Und wieso über typedef ?

    Sorry aber ich bin etz grad a bisserl verwirrt 🙂
    Hoffe auf Antworten ... verstehe die Welt nicht mehr *grins* naja so schlimm auch wieder nich hehe

    Gruß und Tschau



  • Ah..sry hab mich im ersten Quelltext verschrieben, der
    Funktionsaufruf muss natürlich

    long g = Zeiger (2, 5)
    

    heißen und net Zega



  • Stell dir mal vor du brauchst mehrere Zeiger auf diesen Funktionstyp. Dann müsstest du für jeden dieses sehr leserliche Konstrukt schreiben. Durch den Typdef machst du das nur einmal und nimmst dann den schöneren Namen. Das ist der ganze Hintergrund.



  • Ok vielen Dank, ich glaube das habe ich schon verstanden.
    Nur wie würde man es denn schreiben, wenn man wirklich immer das "sehr lerserliche" Konstrukt verwenden müsste ?



  • long (*Zeiger)(long,long) = (long(*)(long,long)) GetProcAdress(hMyDLL,"Exec_DeLuxe");
    

    (und wehe, du setzt eine Klammer an die falsche Stelle, dann erkennt der Compiler das nicht mehr wieder)


Anmelden zum Antworten