Dynamische DLL-Einbindung in Dev-C++



  • Hallo,

    Ich beschäftige mich grad mit DLL's und hab dazu auch sämtliche Tutorials gefunden, die allerdings alle für den BCB oder MSVC++ sind. Unter Dev-C++ krieg ich's aber irgendwie nicht gebacken...

    Könnte mal jemand erklären, wie das geht?
    Es soll die DLL erstellt werden und dynamisch mit LoadLibrary geladen werden.
    Die Funktion der DLL kann ne normale MessageBox sein.

    Dann komm ich da mal endlich weiter..

    Vielen Dank schonmal!





  • In den Projektoptionen im Reiter "Allgemein" auf DLL umstellen und sonst wie gehabt.
    Obwohl ich dir von Dev-C++ abraten muss! Das Ding hat nämlich ein paar Probleme wenn es um DLLS geht die in C++ geschrieben wurden.(Bugs frei Haus sozusagen 😉 )



  • ok hier mal ne kleine Beispiel-DLL:

    mydll.h

    #ifndef MYDLL_H
    #define MYDLL_H
    
    #ifdef _CREATE_MYDLL
    #define MYDLL __declspec(dllexport)
    #else
    #define MYDLL __declspec(dllimport)
    #endif
    
    extern "C"
    {
        int MYDLL MsgBox(const char* msg, const char* caption);
    }
    
    #endif
    

    mydll.cpp

    #include <windows.h>
    
    #define _CREATE_MYDLL
    #include "mydll.h"
    
    int MYDLL MsgBox(const char* msg, const char* caption)
    {
        return MessageBoxA(GetDesktopWindow(), msg, caption, MB_OK|MB_ICONINFORMATION);
    }
    

    wenn du das ganze mit *.a einbindest:

    bei Dev-C++ bei Linkeroptionen den Pfad zur *.a-Datei angeben und der Quellcode:

    #include <windows.h>
    #include "mydll.h"
    
    int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
        MsgBox("Hallo", "Hallo");
        return 0;
    }
    

    aber, du willst ja LoadLibrary sehen^^

    also hier der Code:

    #include <windows.h>
    
    typedef int (*LPMSGBOX)(const char*, const char*);
    
    int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
        HMODULE hMyDLL = LoadLibrary("mydll.dll");
        if (hMyDLL == NULL)
            return -1; // Konnte nicht geladen werden!
        LPMSGBOX MsgBox = (LPMSGBOX)GetProcAddress(hMyDLL, "MsgBox");
        if (MsgBox == NULL)
        {
            FreeLibrary(hMyDLL);
            return -2; // Funktion existiert nicht in der DLL!
        }
        MsgBox("Hallo", "Hallo");
        FreeLibrary(hMyDLL);
        return 0;
    }
    

    damit sollte alles funktionieren



  • Also solche Antworten müsste es öfter geben!
    Danke DrakoXP, funktioniert 1a 😉



  • kein Problem

    ich sollte vllt noch erwähnen, dass du mit der LoadLibrary-Methode auf keine Klassen zugreifen kannst.
    und durch das extern "C" ist es dir nicht möglich Funktionen in der DLL zu überladen.

    solltest du beides vorhaben, so ist die Methode mit der *.a-Datei sinnvoller.

    wenn du nur Funktionen überladen willst, so solltest du erst mit einem Tool, wie dllexp.exe in der DLL nachschauen,
    wie die gesuchten Funktionen richtig heißen.



  • DrakoXP schrieb:

    kein Problem

    ich sollte vllt noch erwähnen, dass du mit der LoadLibrary-Methode auf keine Klassen zugreifen kannst.

    Nope, er kann ganz normal nen Klassenzeiger übergeben, dazu muß nur in der DLL und in seinem Programm die gleiche Klassen defenation sein, nur das überladen geht halt nicht, da haste recht.



  • Mann kann aber in ner DLL ne Instanz ner abgeleiteten Klasse erzeugen und zurückgeben, deren virtuelle Basisklasse im Hauptprogramm bekannt ist (und dann natürlich dort auch auf die virtuellen Methoden zugreifen), oder??



  • JimmydaMage schrieb:

    Mann kann aber in ner DLL ne Instanz ner abgeleiteten Klasse erzeugen und zurückgeben, deren virtuelle Basisklasse im Hauptprogramm bekannt ist (und dann natürlich dort auch auf die virtuellen Methoden zugreifen), oder??

    Jupp, sollte gehen.



  • Ja, das geht auch, macht aber in der Praxis selten einen Sinn



  • @orr lol:
    mit auf Klassen zugreifen meinte ich fokgendes ->

    wenn du in der DLL eine Klasse definierst, dann schreibst du deren Member-Funktionen (Methoden) ja auch in die DLL.
    diese Memberfunktionen kannst du aber mit Loadlibrary nicht nutzen.

    obwohl, auf dem C-Weg ... ^^

    naja, das is ne andere Geschichte...

    Aber so ohne weiters glaube ich nicht, dass das geht.

    wenn du eine Klasse in der DLL UND in deinem Programm vollständig implementierst,
    dann kannst du logischerweise auch auf Instanzen der Klasse in der DLL zugreifen 😉

    aber wenn die Klasse nur in der DLL implementiert ist, und du willst sie nutzen, bekommst du Probleme


Anmelden zum Antworten