Zugriff auf Klasse in DLL



  • Hallo,

    ich habe eine Klasse in eine DLL ausgelagert.
    Nun möchte ich die DLL mittels LoadLibrary laden und dann
    auf die Klasse zugreifen können.
    Wie kann ich das realisieren?



  • Beschäftige dich mal mit dem Component Object Model (kurz COM).



  • Könntest du das bitte ein klein wenig präziser formulieren?
    Ich hab gerade davon keinerlei Ahnung und brauch ne Lösung für genau dieses Problem.



  • Man stellt eine ganz normale C-Funktion in der DLL Funktion zur Verfügung, die dann ein Objekt der Klasse erstellt und einen Zeiger darauf zurückgibt.



  • Und wie sieht das mit ner statischen FUnktion der Klasse aus? Ginge sowas anstelle der C-Funktion? Wenn nein, warum nicht?



  • Und wie sieht das mit ner statischen FUnktion der Klasse aus? Ginge sowas anstelle der C-Funktion? Wenn nein, warum nicht?

    Jede Bibliothek hat eine Export-Tabelle. In dieser stehen die dekorierten Namen der Funktionen. Für C gibt es einen Standard, für C++ nicht. D.h. eine DLL mit Klassen kann nur von Programmen genutzt werden, die den gleichen Compiler verwenden, falls dieser Compiler überhaupt in der Lage ist, Klassenexports für DLLs zu erstellen.



  • Irgendwie bekomm ich das nicht auf die Reihe.
    Kann mir das mal bitte jemand anhand von Quelltext verdeutlichen?



  • Also ich setz jetzt hier mal den Code rein zu dem ich gekommen bin der mich aber zu keinem Ziel gebracht hat.

    Der Header der DLL:

    #ifndef _DLL1_H
    #define _DLL1_H
    
    #ifdef _DLL
    #define DLL_TYP __declspec(dllexport)
    #else
    #define DLL_TYP __declspec(dllimport)
    #endif
    
    #include <string>
    
    class DLL_TYP DLL1
    {
    public:
        DLL1();
        ~DLL1();
        void setValue(const std::string &p_strValue);
        const std::string &getValue() const;
    
    private:
        std::string m_strValue;
    };  /// end of class
    
    DLL_TYP DLL1 *getInstance();
    
    #endif
    

    Der Code der DLL:

    #include "DLL1.h"
    
    DLL1::DLL1() : m_strValue("DLL1")
    {
        ;   /// nothing to do
    }
    
    DLL1::~DLL1()
    {
        ;   /// nothing to do
    }
    
    void DLL1::setValue(const std::string &p_strValue)
    {
        m_strValue = p_strValue;
    }
    
    const std::string &DLL1::getValue() const
    {
        return m_strValue;
    }
    
    __declspec(dllexport)DLL1 *getInstance()
    {
        static DLL1 *m_pInstance = NULL;
    
        if(m_pInstance == NULL)
        {
            m_pInstance = new DLL1;
        }
    
        return m_pInstance;
    }
    

    Und das Hauptprogramm:

    #include <DLL1.h>
    #include <DLL2.h>
    
    #include <iostream>
    #include <string>
    
    #include <windows.h>
    
    void useDLL(const std::string &p_strDLLName);
    
    int main()
    {
        useDLL("DLL1");
    
        return 0;
    }
    
    void useDLL(const std::string &p_strDLLName)
    {
        HINSTANCE dllInstance;
    
        if(dllInstance = LoadLibrary(p_strDLLName.c_str()))
        {
            typedef DLL1*(* fkt)();
            fkt method;
    
            if(method = (fkt)GetProcAddress(dllInstance, "getInstance"))
            {
                std::cout << "Funzt!" << std::endl;
            }
            else
            {
                std::cerr << "Loading method failed." << std::endl;
            }
        }
        else
        {
            std::cerr << "Loading dll " << p_strDLLName << " failed." << std::endl;
        }
    }
    

    Die Library kann ich noch laden aber auf die getInstance Methode bekomm ich keinen Zugriff.
    Was mach ich falsch?



  • extern "C" DLL_TYP DLL1 *getInstance();



  • Diese Klasse

    class DLL_TYP DLL1
    {
    public:
        DLL1();
        ~DLL1();
        void setValue(const std::string &p_strValue);
        const std::string &getValue() const;
    
    private:
        std::string m_strValue;
    };  /// end of class
    

    lässt sich grundsätzlich nicht exportieren.
    Grund: std::string ist eine 'inlined' member, wird also erst im Hauptprogramm kompiliert. Die DLL ist aber fertig kompiliert, wonach der Typ des Objekts unbekannt wird. (es gibt mehrere Implementationen von std::string)



  • Und wie ist die Lösung dafür? 😕



  • Danke!


Anmelden zum Antworten