DLLs aufrufen und dessen Funktionen ausführen



  • Die Exportierung habe ich oben beschrieben - Du erstellt einfach ein Win32 Projekt, dann unter den Einstellungen wählst du eine DLL aus und haust die oben beschriebene Fkt. in eine CPP Datei und voila, die DLL ist fertig (angenommen Du arbeitest mit VS2005)

    Die DLL kann entweder statisch oder dynamisch geladen werden. Ich werde jetzt erstmal auf die dynamische Variante eingehen:

    irgendwo in der main:

    HMODULE hDLL = LoadLibrary("Dllname.dll");
    void (*pfunc)() = (void (*)()) GetProcAddress(hDLL, "test");
    pfunc();
    

    Damit wird dann die test() Funktion in der DLL aufgerufen. Achtung, es wurde keine Fehlerüberprüfung durchgeführt...
    Wichtig ist nur, dass die DLL auch auffindbar ist 🙂 Sonst liefert LoadLibrary() NULL.

    Logisch soweit?



  • Cool! Danke "pub00515"! 🙂

    Hat funktioniert und war super leicht!

    Gruß LukasBanana



  • Da empfiehlt sich auch ein typedef zu verwenden. Macht die ganze Sache übersichtlicher 😉 .



  • CodeFinder schrieb:

    Da empfiehlt sich auch ein typedef zu verwenden. Macht die ganze Sache übersichtlicher 😉 .

    Vielleicht so?

    typedef extern "C" __declspec(dllexport) DLLexport;
    

    Gruß LukasBanana



  • Nee dafür benutzt Du besser ein #define.

    Also

    #define DLLEXPORT __declspec(dllexport)
    

    Was Codefinder vermutlich meint, sind typedefs für die Funktionspointer.
    z.B.

    typedef void (*voidfunc)();
    

    Dann kannst Du schreiben:

    voidfunc pfunc = (voidfunc) GetProcAddress(...)
    

    macht die Sache wesentlich übersichtlicher wenn der Prototyp länger wird. Oder man es oft benutzt :-).



  • Hehe, ne so (sry, hätte das Bsp sofort posten sollen):

    typedef void (*PFUNCTION)(void); // 'PFUNCTION' wird jetzt wie ein Typ behandelt, also bspw. wie int
    HMODULE hDLL = LoadLibrary(TEXT("Dllname.dll")); // DLL laden
    if(hDLL != NULL) // Prüfen, ob DLL erfolgreich geladen werden konnte
    {
       // Funktionszeiger-Variable anlegen und Adresse der Funktion in der DLL ermitteln:
       PFUNCTION pFunction = reinterpret_cast<PFUNCTION>(GetProcAddress(hDLL, "test"));
       if(pFunction != NULL) // Wichtig: Konnte die Adresse der Funktion erfolgreich ermittelt werden ? Falls nein, darf die Funktion nicht aufgerufen werden, sonst würde es hier eine Access-Violation geben!
          pFunction(); // Erfolgreich ermittelt, also aufrufen!
    }
    


  • Also so:

    /* ... */
    typedef (void (*)()) voidfunc;
    typedef (int (*)()) intfunc;
    typedef (float (*)()) floatfunc;
    /* ... */
    void (*MyFunc)() = voidfunc GetProcAddress(hDLL, "MyDLLFunction");
    

    Gruß LukasBanana



  • @pub00515: Jupp genau 👍 .



  • LukasBanana schrieb:

    Also so:

    /* ... */
    typedef (void (*)()) voidfunc;
    typedef (int (*)()) intfunc;
    typedef (float (*)()) floatfunc;
    /* ... */
    void (*MyFunc)() = voidfunc GetProcAddress(hDLL, "MyDLLFunction");
    

    Gruß LukasBanana

    Ne der Name des Typs muss direkt dem '*' folgen.
    ➡

    /* ... */
    typedef (void (*voidfunc)());
    typedef (int (*intfunc)();
    typedef (float (*floatfunc)());
    /* ... */
    
    voidfunc MyFunctionPointer;
    MyFunctionPointer = (voidfunc)GetProcAddress(hDLL, "MyDLLFunction");
    

    Siehe auch mein Beispiel oben.



  • Achso, danke ich hab`s jetzt glaub ich kappiert! 👍
    Danke an alle 🙂

    Gruß LukasBanana


Anmelden zum Antworten