3 Fragen zu DLLs



  • Steht eigentlich alles im Beispiel beschrieben. Du kannst in der DLL sozusagen eine Klasse mitliefern.

    Du brauchst nur die *.h und die *.lib der DLL in Dein Projekt einbinden und kannst dann in Deinem Projekt Objekte der DLL-Klasse erzeugen und verwenden. Nicht mehr und nicht weniger.

    (Ist aber meiner Meinung nach eher unüblich. Eigentlich ist es, meiner Meinung nach, praktikabler, wenn eine DLL immer abgeschlossene, eigenständige Funktionen (Blackbox) beinhaltet, an die man vielleicht noch ein paar Parameter übergibt und die sich dann kümmern.)



  • tut mir leid, nach langem probieren, muss ich nochmal, ich bekomm das mit der klasse nicht hin!

    mein code:
    dll_class.h (eine ganz normale unit, welche im projekt der dll zugeordnet ist)

    #ifndef dll_classH
    #define dll_classH
    #include <vcl.h>
    
    #ifdef __DLL__     //für was ist das gut??
    # define DLL_EXP __declspec(dllexport)
    #else
    # define DLL_EXP __declspec(dllimport)
    #endif
    
    class DLL_EXP test
    {
     public:
      String ShowIt(){return "HALLO";}
    
    };
    //---------------------------------------------------------------------------
    #endif
    

    dll.cpp (richtige dll datei)

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #include <windows.h>
    #include "dll_class.h"
    #pragma hdrstop
    //---------------------------------------------------------------------------
    //   Wichtiger Hinweis zur DLL-Speicherverwaltung, falls die DLL die statische
    //   Version der Laufzeitbibliothek (RTL) verwendet:
    //
    //   Wenn die DLL Funktionen exportiert, die String-Objekte (oder Strukturen/
    //   Klassen, die verschachtelte Strings enthalten) als Parameter oder Funktionsergebnisse übergibt,
    //   muß die Bibliothek MEMMGR.LIB im DLL-Projekt und anderen Projekten,
    //   die die DLL verwenden, vorhanden sein. Sie benötigen MEMMGR.LIB auch dann,
    //   wenn andere Projekte, die die DLL verwenden, new- oder delete-Operationen
    //   auf Klassen anwenden, die nicht von TObject abgeleitet sind und die aus der DLL exportiert
    //   werden. Durch das Hinzufügen von MEMMGR.LIB wird die DLL und deren aufrufende EXEs
    //   angewiesen, BORLNDMM.DLL als Speicherverwaltung zu benutzen. In diesem Fall
    //   sollte die Datei BORLNDMM.DLL zusammen mit der DLL weitergegeben werden.
    //
    //   Um die Verwendung von BORLNDMM.DLL, zu vermeiden, sollten String-Informationen als "char *" oder
    //   ShortString-Parameter weitergegeben werden.
    //
    //   Falls die DLL die dynamische Version der RTL verwendet, müssen Sie
    //   MEMMGR.LIB nicht explizit angeben.
    //---------------------------------------------------------------------------
    
    #pragma argsused
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
            return 1;
    }
    
    __declspec(dllexport)void ReadList(TStringList* myList,TEdit* myEdit)
    {
     ShowMessage(myList->Count);
     myList->Add("TEST");
     ShowMessage(myList->Count);
     myEdit->Text = myList->Strings[0];
    }
    //---------------------------------------------------------------------------
    

    mainform.h (programm welches dll aufruft)

    //---------------------------------------------------------------------------
    
    #ifndef mainformcppH
    #define mainformcppH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <Dialogs.hpp>
    #include <Menus.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TOpenDialog *OpenDialog1;
            TMainMenu *MainMenu1;
            TMenuItem *Datei1;
            TMenuItem *ffnen1;
            TEdit *Edit1;
            void __fastcall ffnen1Click(TObject *Sender);
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
            TStringList* VDAList;
    };
    
    __declspec(dllimport) void ReadList(TStringList* myList,TEdit* myEdit);
    __declspec(dllimport) DLL_EXP test t;  //ausdrucksysntax
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    mainform.cpp (aufruf der funktionen)

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "mainformcpp.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::ffnen1Click(TObject *Sender)
    {
    if(OpenDialog1->Execute())
       {
        VDAList = new TStringList();
        VDAList->LoadFromFile(OpenDialog1->FileName);
        ReadList(VDAList,Edit1);
       }
    }
    //---------------------------------------------
    

    lib der dll habe ich der mainform mitgegeben
    ohne klasse klappt auch alles

    also meine frage, was mache ich falsch?

    muss die classe direkt mit in die dll datei (dll.cpp)??
    wie rufe oder erstelle ich eine instanz dieser klasse in dem aufrufendem programm?(mainform.h/.cpp)

    ich bedanke mich schonmal!

    ps. fragen stehen als kommenta im code! (sind im code ja nur 2 )



  • Hallo,

    Das hier

    ifdef __DLL__     //für was ist das gut??
    

    soll der dll_class.h sagen, ob sie in einer dll (exportieren) oder einem normalen Projekt (importieren) inkludiert wurde.
    Du solltest folgendes machen.
    las das hier

    __declspec(dllimport) DLL_EXP test t;  //ausdrucksysntax
    

    in der mainform.h weg.
    Inkludiere in der mainform.cpp die dll_class.h.



  • achso?

    und so macht man das wohl immer mit klassen aus dlls?

    aber das die klassendeklaration nicht direkt in der dll-datei ist, ist ok so?
    oder packt man die eigentlich auch in die dll direkt (so wie die ReadList() Funktion)??



  • Hallo

    Und überprüf das __DLL__ als Bedingung in dem DLL-Projekt eingetragen ist.

    und so macht man das wohl immer mit klassen aus dlls?

    Es ist die eleganteste Möglichkeit. Aber natürlich ist das DLL-Interface dann nicht mehr C-Kompatibel.

    aber das die klassendeklaration nicht direkt in der dll-datei ist, ist ok so?

    😕 Natürlich muß die Klassendeklration auch in dem Projekt integriert sein.

    bis bald
    akari



  • akari schrieb:

    Hallo

    Und überprüf das __DLL__ als Bedingung in dem DLL-Projekt eingetragen ist.

    bis bald
    akari

    was genau ist damit gemeint?sorry ich arbeite wirklich noch nciht so lang mit dlls!

    wo schau ich das nach, bzw ändere ich das?



  • Hallo

    Menü Projekt/Optionen/Verzeichnisse und Bedingungen, dort ist die Liste der Bedingungen, wo in dem DLL-Projekt der besagte Ausdruck als eigene Zeile eingetragen werden soll.

    bis bald
    akari



  • Das wird schon vom Compiler schon automatisch gemacht sobald die Compileroption -WD (Dll erzeugen) gesetzt ist.
    @sdsdsd
    Du brauchst hier also nichts extra einzutragen.



  • akari schrieb:

    aber das die klassendeklaration nicht direkt in der dll-datei ist, ist ok so?

    😕 Natürlich muß die Klassendeklration auch in dem Projekt integriert sein.

    bis bald
    akari

    damit ist aber gemeint, das im der projektansicht, die klassendateien (h.cpp) der dll zugeordnet wurden oder?

    ich habe aber gemeint, das die klassen nicht in der hauptdatei der dll (die, die als erstes erstellt wird, wenn ich auf dll-experte und ersellen klicke, erstellt wird) hineinmuss oder?
    also es können schon seperate dateien sein, nur eben der dll zugeordnet?!

    und bei den bedingungen steht bei mir nur __DEBUG und sonst nix.... 😕



  • Die Klassendeklaration (im Header) muß überall da mit inkludiert werden, wo du sie benötigst.

    und bei den bedingungen steht bei mir nur __DEBUG und sonst nix....

    Das reicht auch, siehe mein obiger Post.


Anmelden zum Antworten