Memberfunktion einer Klasse aus .dll Datei exportieren/importieren



  • Ich schreibe gerade eine .dll Datei in C++, bin aber noch ziemlich grün in diesem Gebiet.

    Wie kann ich eine Methode einer Klasse aus einer dll exportieren? Im Internet findet man viel darüber wie man dies in C machen kann aber nicht mit C++.

    EineMethode importieren geht meines Wissens so:

    class Class1
    {
       ...
    
       public:
       __declspec(dllexport) int Test(void);
    
       ...
    

    Wie kann ich Test in einem anderen Programm aufrufen bzw. importieren?

    Etwa mit:

    __declspec(dllexport) int Test(void);
    

    Wer weiß Rat????

    Ich habe auch gelesen, dass man unbedingt den Konstruktor mitexportieren muss. Stimmt das???



  • Du mußt schon die komplette Klasse als "dllexport" deklarieren.
    (meist werden die Header so eingestellt, daß sie je nach Bedarf für Import oder Export verwendet werden können)

    #ifdef LIB_IMPL //wird nur vom DLL-Projekt definiert
      #define LIB_API __declspec(dllexport)
    #else
      #define LIB_API __declspec(dllimport)
    #endif
    
    LIB_API class LibTest //hier bin ich nicht ganz sicher, wie die Reihenfolge stimmt
    {
      ...
    };
    


  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • CStoll schrieb:

    Du mußt schon die komplette Klasse als "dllexport" deklarieren.

    Vielleicht verstehe ich dich falsch, oder du mich. Ich will nicht die ganze Klasse exportieren sondern nur eine einzelne Funktion/ bzw. Methode.

    Oder heißt das, dass ich die Methode und die Klasse als __dllexport deklarieren muss?

    Ich habe dazu folgende Internetseite gefunden.
    http://www.resourcecode.de/view.php?id=776
    Ich meine den Abschnitt:
    "9. Einzelne Klassenmethoden in DLLs freigeben (C++ DLLs)"

    Ich denke, dass ich es genauso gemacht habe wie es in der Seite erklärt ist. (es kann immer sein, dass ich zu doof war es zu verstehen 😉 )

    Leider steht auf dieser SEite nicht wie man diese Methode dann importiert.
    Ich habe es folgendermaßen versucht, aber es geht nicht:

    __declspec(dllimport) char* probe();
    


  • Da steht doch, dass man sich dann Klasse von der Klasse in der Dll ableiten muss.
    Nun kanst du die Methoden aufrufen.



  • qasdfgh schrieb:

    Da steht doch, dass man sich dann Klasse von der Klasse in der Dll ableiten muss.
    Nun kanst du die Methoden aufrufen.

    Warum muss ich eine Klasse, die ich dann später exportierne will, von der Basisklasse ableiten? Kann ich nicth direkt Methoden von der Basisklasse exportieren?
    Ich habe auch keine Fehlermeldungen wenn ich die .dll-Datei kompeliere.

    Und noch viel wichtiger!!!!
    Wie importiere und verwende ich die in der DLL exportierten Methoden in einem anderem C++ Programm?

    Und gibt es eine Möglichkeit, eine dll Datei zu exportieren, ohne dass ich die Headerdatei der dll in meinem Testprogramm hinzufügen möchte.

    -------------------------------------------------------------------------------
    der Hintergrund für meine Fragen:

    Ich habe ein Program geschrieben, welchen viele Libraries von DirectX und dem Platform SDK benötigt.
    Nun will ich dieses Programm in eine dll umwandeln, damit ich nicht jedes mal wenn ich dieses Programm mit einem anderen PC weiterbearbeite, die SDK´s installieren und die zusätzlichen Header- und Bibliotheksverzeichnisse einfügen muss.

    Nun habe ich gedacht ich kann einfach eine DLL daraus machen und kann dann auf einzelne Methoden dieses Programmes daraufzugreifen, ohne dass ich irgend ein SDK benötige.

    Ist das Möglich?



  • gramboler schrieb:

    Ich habe ein Program geschrieben, welchen viele Libraries von DirectX und dem Platform SDK benötigt.
    Nun will ich dieses Programm in eine dll umwandeln, damit ich nicht jedes mal wenn ich dieses Programm mit einem anderen PC weiterbearbeite, die SDK´s installieren und die zusätzlichen Header- und Bibliotheksverzeichnisse einfügen muss.

    Nö, kannste nicht. Dein Pragramm, welches du in eine DLL "umwandeln" willst, kapselt doch nur die entsprechenden SDK's (DirectX und Platform SDK) diese müssen natürlich nebst Header und .LIB für deine erstellte DLL auf dem betreffenden System vorliegen um mit dieser DLL entwickeln zu können bzw. um die damit gelinkten Programme ausführen zu können benötigst du zumindest ein installiertes DirectX.

    Um class'es aus einer DLL zu exportieren musst du dir zunächst darüber klar werden, in welchem Kontext diese Klassen instanziiert werden (sollen). Eine möglichkeit wäre eine Funktion aus der DLL zu exportieren, welche eine neue Instanz der Klasse erstellt und dann einen Pointer auf diese Instanz zurückgibt, wie es auch DirectX macht ( Create...Interface() ). Dann kannst du in deinem Programm die Memberfunktionen über diesen Pointer aufrufen. Stelle jedoch auch eine Memberfunktion á la release() bereit, um den von der Instanz belegten Speicher wieder freizugeben, da dies (da du lediglich einen Pointer zurückgeliefert bekommst) nicht automatisch geschieht, wenn die Programmausführung den Gültigkeitsbereich der Zeigervariable verlässt.

    Good Luck
    Greetz, Swordfish



  • Danke für deine Antwort,... ich werde es ausprobieren 😉


Anmelden zum Antworten