Hilfe mit DLL



  • Hallo,

    habe mir gerade eine DLL geschrieben (zumindest versucht) nach der Anleitung auf
    http://www.resourcecode.de/view.php?id=776

    Kann 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)
    kompilieren

    DLL 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 der

    OnInitDialog-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


Anmelden zum Antworten