Komplexere DLL



  • Hey!
    Jetzt kommt doch wieder noch eine frage^^
    Ich habe folgendes verständnis Problem, damit ich nicht alles in eine Headerdatei packen muss, ich sag erst mal was ich kann und erst dann was ich noch nicht kann^^

    Also ich kann das hier:
    MyDLL.h

    #ifndef MyDLL_H_
    #define MyDLL_H_
    
    #ifdef DLL_EXPORT
    #define DLL __declspec(dllexport)
    #else
    #define DLL __declspec(dllimport)
    #endif
    
    extern "C"
    {
        DLL void Call_My_DLL();
    }
    
    #endif // MyDLL_H_
    

    MyDLL.cpp

    #include <iostream>
    #include "MyDLL.h"
    
    extern "C"
    {
        void Call_My_DLL()
        {
            std::cout << "Hey DLL!^^" << std::endl;
        }
    }
    

    Ich weiß das ich das so machen kan ein header eine quell -datei, aber ich weiß auch das ich es nur in dem Header decladieren muss, aber die Quelldaten mehrere machen kann also inm verschiedenen definieren, die finden sich ja durch das einbinden usw.

    Aber wie funktioniert das bei Bibliotheken wie z.b wx oder Qt?
    Da gibs ja mehrere Header die man einbinden kann und mit der gleichen dll noch laufen nicht nur einen wie müsste man disen Code machen damit das auch so ist? Welcher Trick steckt dahinter?

    Danke im Voraus!
    Mfg Wikinger75!



  • Mal ne kurze frage.
    Warum hab ich von den letzten Tutorials gelesen das des exxtern "C" da ren muss?
    Ich hab mir die Source von den wxWidgets headern angekuckt und das steht das ganze ohne extern C. Kann man also das extern c weglassen? Welchen zweg hat es in der dll?
    Mfg Wikinger75!



  • Also wie kann ich das realiesieren?
    Wie wäre das zu machen das ich eine DLL mit mehreren Headern hinbekomme?
    Kleine Frage nebenbei...
    Wie viele Zeilen darf Maximal eine Header-Datei haben? ^^

    Mfg Wikinger75!



  • Wikinger75 schrieb:

    Also wie kann ich das realiesieren?
    Wie wäre das zu machen das ich eine DLL mit mehreren Headern hinbekomme?

    WAS willst Du?
    Eine DLL exportiert Funktionen, die von ausführbaren Programmen aufgerufen werden können - wenn sie denn diese DLL laden.
    Damit ein ausführbares Programm die Funktionen aufrufen kann, müssen sie (die Funktionen) dem Programm bekannt gemacht werden. Das macht man normalerweise, indem man EINE entsprechende Headerdatei schreibt, in der diese Funktionen deklariert werden, und diese dann in dem Programm, das die Funktionen aufrufen soll, via #include einbindet.
    Selbstverständlich darfst Du aber auch jede exportierte Funktion einzeln in einer eigenen Headerdatei deklarieren, und dann im Programm alle diese Headerdateien einbinden, wem's gefällt ...

    Wikinger75 schrieb:

    Wie viele Zeilen darf Maximal eine Header-Datei haben? ^^

    Mehr, als du tippen möchtest ...

    Mfg Wikinger75![/quote]



  • Wikinger75 schrieb:

    Also wie kann ich das realiesieren?
    Wie wäre das zu machen das ich eine DLL mit mehreren Headern hinbekomme?

    WAS willst Du?
    Eine DLL exportiert Funktionen, die von ausführbaren Programmen aufgerufen werden können - wenn sie denn diese DLL laden.
    Damit ein ausführbares Programm die Funktionen aufrufen kann, müssen sie (die Funktionen) dem Programm bekannt gemacht werden. Das macht man normalerweise, indem man EINE entsprechende Headerdatei schreibt, in der diese Funktionen deklariert werden, und diese dann in dem Programm, das die Funktionen aufrufen soll, via #include einbindet.
    Selbstverständlich darfst Du aber auch jede exportierte Funktion einzeln in einer eigenen Headerdatei deklarieren, und dann im Programm alle diese Headerdateien einbinden, wem's gefällt ...

    Wikinger75 schrieb:

    Wie viele Zeilen darf Maximal eine Header-Datei haben? ^^

    Mehr, als du tippen möchtest ...

    Mfg Wikinger75!

    Ahso also kann ich im Projekt der DLL die alle so verteilen, hauptsache das

    #ifdef DLL_EXPORT
    #define DLL __declspec(dllexport)
    #else
    #define DLL __declspec(dllimport)
    #endif
    

    steht in jeder einzelnen Header und die Funktionen wurden mit DLL decaldiert. Na dann ist das ja gut.^^

    Aber praktisch kann ich das alles dan in eine Header packen?
    Denn falls sie echt viel tragen kann Dann ist des ja gut...

    Mfg Wikinger75!



  • Aber praktisch kann ich das alles dan in eine Header packen?
    Denn falls sie echt viel tragen kann Dann ist des ja gut...

    ???



  • Zitat:

    Aber praktisch kann ich das alles dan in eine Header packen?
    Denn falls sie echt viel tragen kann Dann ist des ja gut...

    ???

    Ja damit auf einmal net so viel Code in einer Header-Datei steckt...



  • In der Header-Datei steht kein Code, sondern nur das, was Du 'decaldierst'.
    Ein Beispiel, das ich hier auf die Schnelle gefunden hab:

    #ifndef MYDLL_H
    #define MYDLL_H
    
    #include <windows.h>
    
    #ifdef BUILD_DLL
    	#define EXP __declspec (dllexport)
    #else
    	#define EXP __declspec (dllimport)
    #endif
    
    #ifdef __cplusplus
    #define EXPORT extern "C" EXP
    #else
    #define EXPORT EXP
    #endif
    
    EXPORT char *testPChar(const char *in, char *out, int outLen);
    EXPORT int testg();
    
    #endif
    

    Hier werden zwei Funktionen exportiert. Wenn Deine DLL mehr Funktionen nach außen zur Verfügung stellen will/soll, einfach weitere Deklarationen hinzufügen.
    In der cpp-Datei zur DLL muss das Makro BUILD_DLL definiert werden, und zwar VOR dem inkludieren des DLL-Headers.



  • Ähm von BUILD-DLL Hab ich noch nie was gesehen^^
    Funktionier bei mir auch ohne...
    Wo finde ich eine erklärung oder wie soll ich das aufbauen?
    Mfg Wikinger75!



  • ... unglaublich ...



  • Ich hab gewußt, daß ich mich hier besser nicht eingemischt hätte ...

    @Wikinger:
    In der Datei, in der die Funktionen definiert werden, also der Quelldatei für die DLL, schreibst Du als allererstes:
    #define BUILD_DLL
    dann irgendwann später
    #include meinDLLheader.h
    oder wie auch immer Deine Headerdatei heißt.

    Wenn Du Dir mal das von mir oben gepostete Beispiel ansiehst, solltest Du erkennen, daß in der Headerdatei dieses Makro abgefragt wird, und davon abhängig die Funktionen als zu exportieren (für die DLL) oder als zu importieren (für ein Programm, das die Funktionen aufrufen will) deklariert werden.



  • Ahso ja gut dann habe ich jetzt alles verstanden 😃
    THX @ all die sich benmüht haben 😃


Anmelden zum Antworten