Klasse in DLL exportieren und im Programm importieren
-
Einfach eine Headerdatei mit der Klassendefinition erstellen und diese später in das gewünschte Projekt includieren (*.lib nicht vergessen!):
#ifndef __MYCLASS_H #define __MYCLASS_H #ifdef __DLL__ # define DLL_EXP __declspec(dllexport) #else # define DLL_EXP __declspec(dllimport) #endif class DLL_EXP MyClass { private: //... protected: //... public: //... }; #endif
-
Diese vorgehensweise funktioniert bei mir mit folgender einschränkung:
Ich kann zwar die Klassenimplementation exportieren, d.h ich kann in meiner Anwendung dynamisch mit new ein neues Objekt aus dieser Klasse erstellen, sämtliche Funktionen sind dann auch vorhanden, aber wenn ich mit delete dieses Objekt zerstören will, wird der Destruktor der Klasse nicht aufgerufen.
Dies kann ich dann aber manuell nachholen.
Ja, so blöd wie das klingt, aber ich rufe den Destruktor des Objektes direkt auf, als wäre es eine normale Funktion.Ich weiss, sowas tut man nicht, mir fällt aber keine andere Lösung ein.
-
Sicher? Die delete-Anweisung hat doch nichts mit der DLL zu tun. Wenn Du ein Objekt mit new-Erzeugst kannst Du es auch mit delete löschen.
-
Sicher,
und wenn ich ein Objekt mit delete lösche, sollte der Destruktor aufgerufen werden.
Wird er aber nicht.
Zumindest nicht, wenn die Klasse in einer DLL steckt.
Es sollte eigentlich nichts miteinander zu tun haben, ich kann allerdings den effekt an meiner dll nachvollziehen.Werd nachher mal ne Test-dll stricken.
-
ups,
sorry,
hab's gerade an einer einfachen testdll nachvollzogen, und ja,
das delete ruft den Destruktor auf.
Hab jetzt nur noch ne Schutzverletzung beim schliessen des Hauptprogrammes, ich nehm mal an, die Dll wird nicht entladen.
-
Fast am Ziel,
aber ich hadere immer noch mit dem delete.Zu der Schutzverletzung, die mir Windows anmeckert, meint CodeGuard, er hätte ein Ressourcenleck erkannt:
Objekt wurde mit new erzeugt (stimmt),
aber nicht gelöscht (stimmt nicht, der Destruktor des Objektes wird ja ausgeführt.OK, ein wenig Quelltext dazu, die dll wird einfach statisch gelinkt.
#include <vcl.h> #pragma hdrstop #include "Unit2.h" #include "File1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm2 *Form2; MyClass *pMyClass; //--------------------------------------------------------------------------- __fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm2::Button1Click(TObject *Sender) { pMyClass = new MyClass(); } //--------------------------------------------------------------------------- void __fastcall TForm2::Button2Click(TObject *Sender) { Label1->Caption = pMyClass->TuWas(); } //--------------------------------------------------------------------------- void __fastcall TForm2::Button3Click(TObject *Sender) { delete pMyClass; } //---------------------------------------------------------------------------
Das wäre das aufrufende Programm, es tut wirklich nichts aussergewöhnliches.
Hier die dll dazu, die tut auch nichts unnormales:
#ifndef __MYCLASS_H #define __MYCLASS_H #ifdef __DLL__ # define DLL_EXP __declspec(dllexport) #else # define DLL_EXP __declspec(dllimport) #endif class DLL_EXP MyClass { private: int i; protected: //... public: MyClass(); ~MyClass(); int TuWas(); }; #endif #include <vcl.H> #include "File1.h" MyClass::MyClass() { ShowMessage("Ich bin der Konstruktor"); i= 42; } //------------------------------------------------------------------------------ MyClass::~MyClass() { ShowMessage("Ich bin der Destruktor"); } //------------------------------------------------------------------------------ int MyClass::TuWas(){ ShowMessage("Ich tu was"); return i; }
-
Hm seltsames Phänomen, fällt mir derzeit auch nichts dazu ein.
-
hallo,
guck doch einfach in das tutorial über dlls in diesem forum. da steht alles dring, mit beispielprogramm, und das alles sogar wahlweise dynamisch also ohne diese lib-datei, denn wenn du mit lib arbeitest, geht das programm nicht mehr, wenn die dll nicht vorgefunden wird...
http://bcb-tutorial.c-plusplus.net/mfg
murph
-
@murph:
das TUT kenn ich, leider ist gerade zu diesem Problem das entsprechende Kapitel (noch?) nicht vorhanden. Es ist aber auch kein Prob mit der Einbindung, es geht nur um das erzeugen/zerstören eines Objektes.
-
hallo,
@silentsurver: wenn du willst kann ich dir ne demo schicken, die deine probleme lösen dürfte, nenn hier einfach deine mail und ich schicks dir vorbei, würde zu weit führen, den kompletten code hier reinzuhaun...
mfg
murph