Klassen in DLL's



  • Hi,
    ich belese mich grad etwas mit dem Thema DLL's und hätte da ein paar fragen.
    Praktische Erfahrung habe ich zum Thema noch keine.

    Ich denke dass ich das mit "normalen" Funktionen in DLL's verstanden habe.
    Folgendes Problem.
    Ich habe mehrere Klassen die ich in eine DLL stecken möchte.
    Diese Klassen werden in verschiedenen programmen genuzt, sollte sich jetzt etwas intern ändern (z.B. code optimierungen) möchte ich die DLL einfach neu bauen und bei den betreffenden Anwendungen einfach austauschen.

    Ich habe etwas herum gegoogelt und für mich keine vernünftige lösung finden können.

    Sowas wie hier möchte ich einfach nicht nutzen um an meine Klasse zu kommen, da muss es doch eine bessere/elegantere Lösung geben.

    extern "C" void* DLLIMPORT CreateClassInstance()
    {
        return ((void*)(new MyClass));
    }
    

    Mein testversuch sieht folgendermaßen aus.

    Headder

    #ifndef _TEST_H_
    #define _TEST_H_
    
    #ifdef __TEST_H__
    #   define DllUse __declspec(dllexport)
    #else
    #   define DllUse __declspec(dllimport)
    #endif
    
    class DllUse DllTestClass
    {
    public:
    
        DllTestClass();
        ~DllTestClass();
    
        void Print ();
    };
    #endif
    
    #define __TEST_H__
    
    #include "Test.h"
    #include <stdio.h>
    
    DllTestClass::DllTestClass()
    {
    
    }
    
    DllTestClass::~DllTestClass()
    {
    
    }
    
    void DllTestClass::Print()
    {
        printf("Ich Bin eine test Klasse");
    }
    

    Wie komme ich denn jetzt in einem Anderen Projekt an meine Klasse heran, bzw ist die Klassen Definition so richtig oder fehlt noch etwas?

    Gruß,
    Sascha



  • #define __TEST_H__
    
    #include "Test.h"
    

    Das wird dir kein besonders erfolgreiches Ergebnis bescheren.

    Wie komme ich denn jetzt in einem Anderen Projekt an meine Klasse heran, bzw ist die Klassen Definition so richtig oder fehlt noch etwas?

    Ansonsten steht hier alles was du wissen musst: http://msdn.microsoft.com/en-us/library/ms682589(VS.85).aspx



  • Sascha schrieb:

    ich belese mich grad etwas mit dem Thema DLL's und hätte da ein paar fragen.

    Vielleicht eines vorneweg: Dlls sind nicht Teil des C++ Standards, und können unter unterschiedlichen Plattformen auch anders umzusetzen sein.

    Sascha schrieb:

    Ich habe mehrere Klassen die ich in eine DLL stecken möchte.

    Zudem bist du auf C-Schnittstellen festgelegt (also Keine Klassen etc.) wenn du dich nicht gerade auf genau einen Compiler und eine Compilerversion festlegen willst (sofern überhaupt möglich). Wie C++ Konstrukte in einer DLL behandelt werden ist nämlich nicht definiert, und auch die Typen können sich unterscheiden (unterschiedliche Compiler verwenden z.B. unterschiedliche Standardbibliotheken etc.).

    Sascha schrieb:

    Ich habe etwas herum gegoogelt und für mich keine vernünftige lösung finden können.

    Es gibt leider auch keine Vernümpftigen. Es gibt einige Tricks etc. wie man unter Umständen auch Klassen über DLLs und Compilergrenzen hinweg exportieren/importieren kann - aber selbst diese Tricks garantieren nichts (wie ich auch aus eigener Erfahrung bestätigen kann).

    Die beste Möglichkeit unter C++ ist noch wenn eine Bibliothek im Sourcecode vorliegt. Ansonsten kann ich dir nach dem derzeitigen Stand (was auch für den Kommenden Standard immer noch gilt) sagen: Klassen und dlls sind unter C++ ein eher unschönes Thema (Hier sind .Net und Java deutlich besser).

    @David_pb: Für links gibt es nicht ohne Grund eigene Tags. Hier nochmal der Link von dir...



  • okay alles Klar, dank dir asc!
    Hatte mich schon gewundert warum in allen Tutorials die ich gefunden habe und auch in der msdn nie auf klassen eingegangen wird sondern nur auf Funktionen.

    Gruß,
    Sascha

    edit:
    So interesse halber, wie sähe denn eine Lösung mit .Net aus?



  • asc schrieb:

    @David_pb: Für links gibt es nicht ohne Grund eigene Tags. Hier nochmal der Link von dir...

    Und weiter? 🙄



  • Hallo Sascha,

    wenn du alle Programme mit demselben Compiler erstellst, dann kannst du auch Klassen exportieren. Solange du die Schnittstelle nicht änderst, kannst du dann auch einfach die DLL austauschen.

    Unter .NET z.B. mittels C++/CLI sind die DLLs (auch Assemblies genannt) normiert, so daß sie für verschiedene .NET-Sprachen und Systeme funktionieren.



  • Hey Th69,

    also sieht es ohne .Net eher schlecht aus?
    Ein App müsste ohne .Net Framework unter WinCe laufen, ein anderes wiederum mit C#.

    Um es mal direkt am Beispiel zu sehen.
    Folgendes Frage/Problematik mit der gefundenen Lösung hat mich dann hier her geführt: Forum Eintrag

    Das ganze serialisierungs Thema soll eben diese Klasse(n) übernhemen.

    Ich möchte also meine Klasse nicht zweimal (einmal c++ und einmal c#) implementieren, sondern den Code zentral haben. Deswegen wollte ich es via Dll lösen.

    Evtl gibt es da ja auch einen besseren Ansatz.

    Gruß,
    Sascha


Log in to reply