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!