Klasse aus DLL, aber wie importieren?
-
Hallo,
ich habe eine klasse in einer dll:
dll.cppclass __declspec(dllexport) Test { public: void ShowIt(){ShowMessage("AUS TEST");} };und möchte diese in meinem programm verwenden
main.cppvoid __fastcall TForm1::Button1Click(TObject *Sender) { HINSTANCE h = LoadLibrary("Project2.dll"); if(h) { } else { ShowMessage("Datei wurde nicht gefunden"); } }aber wie importiere ich die klasse?
muss ich hier auch einen zeiger erstellen wie bei funktionen und variablen, wie üsste dieser aussehen?oder geht es ganz anders?
-
Hi,
muss wohl ein bekanntes Problem einer bestimmten Klasse sein.
Vielleicht kann dir folgender Link weiter helfen.http://www.c-plusplus.net/forum/viewtopic-var-t-is-171528.html
Grüsse
-
Du kannst Klassen so nicht dynamisch importieren. Du kannst aber Funktionen importieren, die dir Zeiger auf Klasseninstanzen liefern. Du erzeugst dann die Klasseninstanz innerhalb der dll und importierst einen zeiger auf diese Instanz in deine Anwendung. Das Freigeben des Speichers für diese Instanzen sollte dann auch in der dll mit Hilfe einer weiteren exportierten Funktion erfolgen.
// in der dll class Test { }; extern "C" __declspec(dllexport) Test* getTest() { return new Test; }
-
Hi,
Braunstein hat sicher Recht.....

Hier mal wie man das laut meinem Buch macht....
Man braucht die Headerdatei und die libdatei der Header.
Ich glaub es geht auch nur mit der Header wird hier aber nicht beschrieben1. ShowMessage wird nicht in einer DLL funktionieren da es eine VCL spezifische Sache ist!!! 2. man muss die Headerdatei der dll in das Projekt einbinden #include "dll.h" 3. man muss beim Dll erzeugen die lib Datei mit erzeugen lassen BCB.Menü.Oben->Projekt->Optionen->Linker->(haken bei lib erzeugen)So... hier mal der Code wie er bei mir funkioniert
DLL.h
class __declspec(dllexport) Klasse { //Klasse kanst dein name nehmen public: //aber immer beibehalten Klasse(HWND hwnd); void hallo(char *titel, char* text); //die funktionen (deine eigenen) private: HWND hWnd; //der Zeiger-> dass MessageBox weis wo sie }; //hin mussDLL.cpp
#include <windows.h> #pragma hdrstop //das einfügen!!!!! #include "dll.h" //das einfügen!!!!!! int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { return 1; } //--------------------------------------------------------------------------- Klasse::Klasse(HWND hwnd) { hWnd = hwnd; } void Klasse::hallo(char *titel, char* text) { MessageBox(hWnd, text, titel, MB_OK | MB_ICONEXCLAMATION); }das Projekt
So und jetzt zu deiner eigenlichen Frage wie ruft man die Funktion einer
Klasse auf die in einer DLL steckt....
1. die DLL.lib in das Projekt einfügen Projekt->Dem Projekt zufügen
2. oben #include "dll.h"#include "dll.h" void __fastcall TForm1::Button1Click(TObject *Sender) { Klasse huhu(Application->Handle); //Klasse steht da weil in der dll.h so steht!! huhu.hallo("der Titel", "das ist der Text"); } //---------------------------------------------------------------------------Hoffe das beantwortet alles!!!
Grüsse

*edit* hab erst jetzt gesehen, das noch viele Präprozessor-anweisungen drin waren (unötige)
*edit* jetzt is aber gut oder

-
also hab ich das richtig verstanden, das ich klassen GARNICHT dynamisch exportieren kann, so wie normale variablen?
Geht nur über funktionen oder eben statisch?
-
Braunstein schrieb:
Du kannst Klassen so nicht dynamisch importieren. Du kannst aber Funktionen imortieren, die dir Zeiger auf Klasseninstanzen liefern. Du erzeugst dann die Klasseninstanz innerhalb der dll und importierst einen zeiger auf diese Instanz in deine Anwendung. Das Freigeben des Speichers für diese Instanzen sollte dann auch in der dll mit Hilfe einer weiteren exportierten Funktion erfolgen.
// in der dll class Test { }; extern "C" __declspec(dllexport) Test* getTest() { return new Test; }eine frage noch hierzu:
wie kann ich denn die funktion im programm verwenden?
ich muss die funktion doch eigentl so benutzen:Test* t = getTest();aber Test ist ja nicht bekannt!
Oder soll ich einen void-zeiger nehmen und diesen casten?
-
Hallo
bvbcvb schrieb:
also hab ich das richtig verstanden, das ich klassen GARNICHT dynamisch exportieren kann, so wie normale variablen?
Geht nur über funktionen oder eben statisch?Ja, Klassen nur statisch.
aber Test ist ja nicht bekannt!
Natürlich muß zur Verwendung von getTest auch Test bekannt sein. Wenn du Klassen verwenden willst, komst du nicht um die vollständige bekannte Klassendefinition umhin.
Oder soll ich einen void-zeiger nehmen und diesen casten?
void-Zeiger sollten vermieden werden. Und zum casten brauchst du auch wieder die Zielklasse.
bis bald
akari
-
akari schrieb:
Hallo
Natürlich muß zur Verwendung von getTest auch Test bekannt sein. Wenn du Klassen verwenden willst, komst du nicht um die vollständige bekannte Klassendefinition umhin.
bis bald
akariok, und wie mache ich die klasse bekannt, wenn ich ja nur über funktionen dynmaisch auf die dll zugreifen will?
-
Hallo,
akari schrieb:
Wenn du Klassen verwenden willst, komst du nicht um die vollständige bekannte Klassendefinition umhin.
Die Deklaration der Klasse reicht. Du mußt also lediglich die Headerdatei, in der die Klasse deklariert worden ist, mit in das Projekt aufnehmen.
Wenn man Teile der Klassendeklaration verstecken will, kommt man nicht darum herum eine separate Wrapperklasse zu schreiben, die nur die notwendigen Funktionen offenlegt. Dies ist aber meist nicht nötig.
-
Hallo
*Unsinn*
bis bald
akari
-
Hier veilleicht noch ein Hinweis: http://www.junix.ch/dll_and_vcl.html
Ich hab den Artikel mal vor Urzeiten von einer anderen Webseite gesichert.