Klasse in DLL exportieren und im Programm importieren
-
Hi, kann mir jemand sagen, wie ich Klassen in einer DLL exportieren kann bzw. dann wieder im Programm importieren kann???
Schon mal danke im voraus...
-
FAQ DLL einbinden
[ Dieser Beitrag wurde am 11.06.2003 um 21:34 Uhr von YLIREBUS editiert. ]
-
Das ist ja alles ganz toll aber
1. Steht da nirgendwo drin wie man eine KLASSE in der dll nach außen hin zur verfügung stellt und
2. hab ich ne Lib zur verfügung...
-
was ist es denn für eine Komponente?
Also generell wäre sowas mit jeder Komponente möglich. Ich kann ja mal
ein paar sachen außprobieren vielleicht stoß ich auf ne Lösung. Ist auf jeden fall ein interessantes Problem
-
Also für template klassen gibs ne Anleitung wenn du in der hilfe unter
index DLLs, Template eingibst.
Mit Objekten hab ichs auch schon fast raus aber das Importieren macht mir noch schwierigkeiten...
-
eine Einfache Klasse...
class TWasweißich { private: public: void __fastcall blabka(int xy); protected: __published: } void __fastcall TWasweißich::blabka(int xy) { bla; bla; }
So und wie kann ich jetzt die Klasse aus der DLL exportieren?
Bei einer Funktion geht das ja so:extern "C" __declspec(dllexport) void __fastcall blabka(int);
-
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