Hilfe mit DLL
-
Hallo,
habe mir gerade eine DLL geschrieben (zumindest versucht) nach der Anleitung auf
http://www.resourcecode.de/view.php?id=776Kann die DLL erstellen. Nun will ich ein Testprogramm schreiben um die DLL zu testen, die Klasse wird auch im Klassenreiter angezeigt, klicke ich nun bei einer der Funktionen auf "Gehe zu Definition" kommt folgende Fehlermeldung:
"Definition(Implementierung) dieser Funktion nicht gefunden!"
DLL-Datei liegt im System32 Ordner, im Projektordner und wurde auch hinzugefügt.
Woran kann das liegen?
Danke
-
Wie soll er denn auch den SourceCode einer eingebundenen DLL finden? Du kannst dir nur die Funktionsdeklaration (header-datei) ansehen, aber nicht die Funktionsdefinitionen. Sonst könntest du ja auch in alle Windows-DLLs "reingucken"
-
Ja das ist mir ja auch klar. Vielleicht habe ich ja auch das Prinzip mit dem DLL erstellen nicht geschnallt.
In der DLL stehen doch die Funktionen drin, die man anderen (Programmen usw.) zur Verfügung stellen will.
Habe eine einzige Klasse mit 5 Funktionen. ich muss daher ja nur die Klasse exportieren, dann werden die Funktionen mit exportiert, oder?
Die fertige DLL müsste doch dann om Ordner "Debug" im Projekt liegen?
-
Genau,
wenn du eine gesamte Klasse exportieren willst, willst du also eine DLL erstellen die nur von MFC-Programmen zu benutzen ist, da man normalerweise nur Funktionen exportiert.
Du erhälst nach dem kompilieren normalerweise deine DLL und eine LIB. Die Lib musst du in das Projekt einbinden, damit der Compiler nicht meckert, diese enthält jedoch nicht die wirklichen Funktionen, würde ja sonst statisch gelinkt.Du bindest also in dein Projekt welches die DLL benutzen möchte zum einen die Header-Datei ein, darin kannst du auch gleich die entsprechende lib dazu linken
bla.h
#ifndef _CREATEMYDLL #pragma message("Automatic Linking bla.lib") #pragma comment(lib,"bla.lib") #endif
Ich benutze bei mir einfach die gleiche Header-Datei sowohl fürs erstellen der DLL und der Projekte, welche die DLL benutzen, im DLL-Projekt setze ich dann die Precompiler-Konstante _CREATEMYDLL in den Pojekt-Settings, weil selbst einbinden kann sich die DLL natürlich nicht
Die DLL muss sich dazu entweder in einem Path-Verzeichnis oder dem Programm-Pfad befinden..
kleiner tipp: Wenn du die Header-Datei nicht nur über #include einbindest, sondern auch zu den projekt-dateien hinzufügst funktioniert sogar die Codevervollständigung..
-
Die DLL befindet sich im Projekt-Verzeichnis. Und die Lib habe ich über "Dem Projekt hinzufügen->Dateien" hinzugefügt.
Auch die xyz.h Datei ist im Projekt drin.Vielleicht sollte ich es mal nur mit den Funktionen und nicht mit der Klasse testen
-
So ich habe das mal eben Schritt für Schritt gemacht und
mitgeschrieben:Die beiden Projekt kann man hier hier herunterladen und ansehen/austesten
Zuerst erstellen wir uns mal eine einfache DLL:
Neues Projekt
MFC-DLL-Assistent (MyDLL) / MFC-Erweiterungs-DLL auswählen!
Allgemeine Klasse einfügen (CMyDLLClass)
Methode einfügen (GetText())
Klasse in der Header Datei als AFX_EXT_CLASS deklarieren (class AFX_EXT_CLASS CMyDLLClass)
kompilierenDLL fertig
So und jetzt die Anwendung welche die DLL nutzt:
Neues Projekt
MFC-EXE-Assistent (MyProggi) / Dialogfeldbasierend (damit erstmal einfacher ist)
Headerfile und Lib in neuen Projekt-Ordner kopieren (MyDLLClass.h, MyDLL.lib)
DLL in den Debug-Ordner kopieren (MyDLL.dll)
die lib dem Projekt hinzulinken:
MyProggiDlg.cpp:#pragma message("Automatic Linking MyDLL.lib") #pragma comment(lib,"MyDLL.lib")
und nun noch die Header-Datei einbinden
MyProggiDlg.cpp:#include "MyDLLClass.h"
jetzt kann man ganz einfach ein Objekt der Klasse CMyDLLClass
erzeugen und die Methoden davon aufrufen, zum Beispiel in derOnInitDialog-Methode:
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen CMyDLLClass c; AfxMessageBox(c.GetText());
und das ganze nun kompilieren.. FERTIG..
fürn Anfang gar nicht so schwer oder?
-
Vielen vielen Dank für die Hilfe.
Es geht!!! Super
Danke