Klassen in DLL
-
Nach mühevoller Kleinarbeit kann ich DLLs erzeugen und Funktionen aus den DLLs auch nutzen (via lib-Datei). Das gilt auch für einzelne Methoden aus Klassen.
Was mir nicht gelingt: Klassen mit allen Eigenschaften und Methoden in einer DLL unterzubringen und diese dann zu linken, damit mir die ganze Funktionalität der Klasse zur Verfügung steht.
-
Genau wie Funktionen
#ifdef __DLL__ # define DLL_TYP __declspec(dllexport) #else # define DLL_TYP __declspec(dllimport) #endifclass DLL_TYP GFile { public: ...... private: ........ };
-
Hallo
Header der Klassen-Unit, die in der DLL verfügbar gemacht werden soll
#if BUILDING_DLL #define DLL_IMPORT __declspec(dllexport) #else #define DLL_IMPORT __declspec(dllimport) #endif class DLL_IMPORT myclass ... { }In den Projekt-Eigenschaften der DLL fügst du unter Verzeichnisse/Bedingungen in der Liste Bedingungen BUILDING_DLL hinzu.
Nachdem kompletten Kompilieren der DLL hast du nun die .lib
Sowohl .lib als auch diese Header-Datei bindest du in deinem darauf zugreifenden Host-Projekt ein, fertig./Edit : viel zu langsam
bis bald
akari
-
... zunächst vielen Dank.
So in der Art habe ich es mir ja vorgestellt; nur leider funkt das nicht so richtig.

Könnte das an meiner alten Version 4 des Borland c++ Builders liegen?
-
nur leider funkt das nicht so richtig.
Ist kein Fehler. Sollen wir raten was nicht geht?
-
Der Fehler ist ein altbekannter Linkerfehler:
Unresolved external 'Crechnen::addieren(int)' referenced from ...\DLL_USER.OBJ.Schnipsel vom Code der DLL:
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) { return 1; } //--------------------------------------------------------------------------- __declspec(dllexport) int doppel(int _einfach) { return (2 * _einfach); } //--------------------------------------------------------------------------- class __declspec(dllexport) Crechnen { public: int addieren(int _zahl) { return (200 + _zahl); } };und wenn ich die Funktionen aus der DLL benutzen will ...
Label1->Caption = doppel(9); // liefert 18 Label1->Caption = rechnen->addieren(200); // funkt nicht!
-
rechnen->addierenWie hast du die Klasse erstellt? Da du einen Zeiger hast, wirst du wohl LoadLibrary und GetProcessAdress genutzt haben?
Alternativ kannst du die Lib in dein Projket mit aufnehmen und die Klasse mit
CRechnen rechne;
erzeugen
-
Wie zum Teufel soll dein Programm (falls du wirklich GetProcAddress() verwendet haben solltest) wissen, auf welche Instanz sich der Aufruf
rechnen->addieren( 200 );bezieht?
Das wird so niemals funktionieren.
Bei Klassen musst du eine pure virtual Basisklasse (Interface) haben, welche sowohl in DLL als auch in deiner Application bekannt ist. In der DLL leitest du dann die eigentliche Implementation davon ab und überschreibst alles virtuelle. Um diese Klasse zu instanziieren, benötigst du eine Funktion in der DLL, welche ein neues Objekt erstellt und einen Pointer darauf zurückgibt:
/* unser Interface: */ class ITestClass { public: virtual void test_method ( ) = 0; virtual void release( ) = 0; }; /* die Implementation: */ class CTestClass : public ITestClass { public: CTestClass( ) { }; ~CTestClass( ) { }; virtual void test_method( ); virtual void release( ); }; void CTestClass::release( ) { delete this; } void CTestClass::test_method( ) { MessageBox( 0, "CTestClass::test()", "DLL:", MB_OK ); } /* Die einzige Funktion, welche exportiert wird: */ TEST_API ITestClass* GetTestClassInterface( void ) { return dynamic_cast< ITestClass* >( new CTestClass() ); }Greetz, Swordfish
-
Den dynamic_cast solltest du weglassen. Der ist bei einem Upcast unnötig.
-
Mit Hilfe eurer Anregungen konnte ich mein Problem lösen.

Ich danke für eure Mühe und eure Geduld