Dll's Klasse Dynamisch einbinden ?!?



  • Hi!
    Ich beschäftige mich gerade ein Bissl mit Dll's
    Besonders interessiert mich wie man eine Klasse oder eine Funktion daraus dynamisch laden kann... Ich komme da nicht so ganz weiter. Also eine Funktion über einen Funktiospointer zu laden habe ich hinbekommen, wie müsste ich da bei eine Klasse vorgehen ? Hier mal mein Beispiel für Funktionen:

    [Header der DLL]:

    #ifndef _DLL_H_
    #define _DLL_H_
    
    #if BUILDING_DLL
    # define DLLIMPORT __declspec (dllexport)
    #else 
    # define DLLIMPORT __declspec (dllimport)
    #endif 
    
    extern "C"
    {
        DLLIMPORT void Hello(void);
    }
    
    #endif
    

    [Source der DLL]:

    /* Replace "dll.h" with the name of your header */
    #include "dll.h"
    #include <windows.h>
    
    extern "C"
    {
        DLLIMPORT void Hello(void)
        {
            MessageBox(NULL, "Hallo Welt", "MsgBox", MB_OK | MB_ICONINFORMATION);
        }
    }
    
    BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                           DWORD reason        /* Reason this function is being called. */ ,
                           LPVOID reserved     /* Not used. */ )
    {
        switch (reason)
        {
          case DLL_PROCESS_ATTACH:
            break;
    
          case DLL_PROCESS_DETACH:
            break;
    
          case DLL_THREAD_ATTACH:
            break;
    
          case DLL_THREAD_DETACH:
            break;
        }
    
        /* Returns TRUE on success, FALSE on failure */
        return TRUE;
    }
    

    Ausführung:

    #include <cstdlib>
    #include <iostream>
    #include <windows.h>
    //#include "dll.h"
    
    using namespace std;
    
    HINSTANCE new_handle = NULL;
    
    typedef int (*AddFunc)(int,int);
    typedef void (*extVoid)();
    
    int main(int argc, char *argv[])
    {
        new_handle = LoadLibrary("dllBsp1.dll");
        extVoid _extVoid;
    
        if (!new_handle)
        {
            cout<<"dll nicht geladen"<<endl;
        }else
        {
            _extVoid = (extVoid)GetProcAddress(new_handle, "Hello");  
        }  
        _extVoid();
    
        FreeLibrary(new_handle);
        system("PAUSE");
        return 0;
    }
    

    Wie müsste ich vorgehen wenn ich das ganze mit einer Klasse machen will ?

    also

    [Header]

    #ifndef _DLL_H_
    #define _DLL_H_
    
    #if BUILDING_DLL
    # define DLLIMPORT __declspec (dllexport)
    #else /* Not BUILDING_DLL */
    # define DLLIMPORT __declspec (dllimport)
    #endif /* Not BUILDING_DLL */
    
    extern "C"
    {
        class DLLIMPORT DllClass
        {
          public:
            DllClass();
            virtual ~DllClass(void);
            void Hello(void);
    
          private:
    
        };
    }
    #endif /* _DLL_H_ */
    

    [Source]

    /* Replace "dll.h" with the name of your header */
    #include "dll.h"
    #include <windows.h>
    
    extern "C"
    {
        DllClass::DllClass()
        {
    
        }   
        DllClass::~DllClass ()
        {
    
        }
        void DllClass::Hello(void)
        {
            MessageBox(NULL, "Hallo Welt", "MsgBox", MB_OK | MB_ICONINFORMATION);    
        }
    }
    
    BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                           DWORD reason        /* Reason this function is being called. */ ,
                           LPVOID reserved     /* Not used. */ )
    {
        switch (reason)
        {
          case DLL_PROCESS_ATTACH:
            break;
    
          case DLL_PROCESS_DETACH:
            break;
    
          case DLL_THREAD_ATTACH:
            break;
    
          case DLL_THREAD_DETACH:
            break;
        }
    
        /* Returns TRUE on success, FALSE on failure */
        return TRUE;
    }
    

    Ich würde mich über jedliche Hilfe sehr freuen !
    Mfg McMorf





  • das beantwortet aber meine frage nicht 😉

    ich will ja wissen wie ich die Klasse dynamisch einbinden kann, nicht wie man sie erstellt ^^



  • Ich behaupte garnicht, oder nur mit sehr speziellen Kenntnissen darüber, wie Dein Compiler, in der vorliegenden Version, die Klassen- und Methodennamen codiert (Stichwort Name Mangling).

    Darüberhinaus behaupte ich, dass eine Klassendefinition innerhalb von extern "C" keinen Sinn macht.



  • Ich behaupte garnicht, oder nur mit sehr speziellen Kenntnissen darüber, wie Dein Compiler, in der vorliegenden Version, die Klassen- und Methodennamen codiert (Stichwort Name Mangling).

    Das guck ich mir mal an...

    Darüberhinaus behaupte ich, dass eine Klassendefinition innerhalb von extern "C" keinen Sinn macht.

    Wieso nicht ?

    Mfg Fugitivus



  • Weil extern "C" dem Compiler sagt, dass er die umschlossenen Funktionen ohne die Anwendung von Name-Mangling exportieren soll (denn nur dann heißt eine Funktion DoSomething in der DLL auch wirklich DoSomething und nicht DoSomething_n4_c4_tSomeType8 oder so). Ohne die Anwendung von Name-Mangling verliert die exportierte Funktion aber sämtliche C++-Fähigkeiten wie Klassen, Namespaces, Überladung, usw.



  • d.H das es ziemlich unsinnig ist eine klasse in eine dll zu packen wenn man sie von auserhalb nutzen möchte ? (also wenn ich sie dynamisch nutzen will ?)


Anmelden zum Antworten