Dlls und verschiedene VS-Versionen



  • Kann man eine mit dem 7er Studio erstellte Dll in einem VS 6 Projekt verwenden?
    Ich bekomme beim Aufruf von Funktionen der Dll eine Access Violation mit dem Hinweis auf die MSVCR70.DLL...
    Die DLL-Schnittstellen beinhalten auch std-container und -strings. Sind die das Problem?



  • ist es eine MFC-DLL oder eine Standard-DLL? Wichtig ist dann auch wie die MFC dazugelinkt wurde, also statisch oder dynamisch.



  • Es ist eine Standard-DLL mit dynamisch gelinkter MFC...



  • joar dann liegts an der dynamischen "Linkung". Die will die alten 6er-MFC-DLLs, in der 7er sind die nämlich etwas anders.
    Also das beste wäre, die DLL, wenn das möglich ist im 6er nochmal statisch zu kompilieren.



  • Zu beachten wäre noch, dass Du niemals Funktionen/Klassen in der DLL exportieren darfst, welche STL/MFC Dinge verwenden /wie z.B. CString), wenn Du statisch gelinkt hast. Da sonst die EXE eine andere CRT verwendet um z.B: den String zu vergrößern/freizugeben.
    Und wenn Du dynamisch linkst (was Du ja dann musst), dann darfst Du nie unterschiedliche Versionen mischen (also VC7/VC8/VC6).

    Also, entweder solche Dinge nicht exportieren oder immer die gleiche CRT/MFC/ATL Version verwenden.



  • @Jochen
    hab ich dich richtig verstanden: wenn ich STL oder MFC- Dinge aus meiner DLL exportieren will, muss meine Dll dynamisch zum Projekt gelinkt werden, damit man die Dll-Funktionalität nutzen kann? Oder meinst du ich muss die MFC dynamisch linken 😕



  • bin zwar nicht Jochen, aber er meinte, wenn du MFC Sachen exportierst, dann kanst du die nur nutzen, wenn der "Nutzer" diesselbe MFC-Version hat.

    Andererseits wenn du ne Standard-DLL machen willst, kannst du eh keine Klassen exportieren.



  • Wie Pellaeon schreibt muss nicht die DLL dynamisch gelinkt werden (also LoadLibrary), sondern Du must *gegen* die DLL-Versionen der CRT/MFC/ATL linken...



  • Noch mehr elementare Fragen:

    Was genau heisst "Klassen exportieren"? In meiner Dll hab ich 2 Schnittstellenfunktionen, die std::strings und Vektoren mit Objekten, die in meiner Dll definiert sind, als Übergabeparamter haben. Die Dll wird dann statisch zu Projekten gelinkt, also geb ich die ganzen Header und die lib mit. Meine Klassen haben alle diese Exportdirektive, keine Ahnung ob man die braucht...Ist das nun schon das, was ihr als Klassenexport bezeichnet?

    Beim Versuch die Dll mit dem 6er Studio zu erstellen bekomm ich jede Menge warnings vom Typ C4251(das die ganzen stl basisklassen ein dll-interface brauchen um von den dll clients benutzt werden zu können...)
    Meine Dll macht zwar das was sie soll, aber am Ende beim Freigeben des Speichers rummst es...ich weiss nicht so richtig was ich falsch mache, im 7er Studio klappt es ja schliesslich auch... 😞



  • mib schrieb:

    Was genau heisst "Klassen exportieren"? In meiner Dll hab ich 2 Schnittstellenfunktionen, die std::strings und Vektoren mit Objekten, die in meiner Dll definiert sind, als Übergabeparamter haben. Die Dll wird dann statisch zu Projekten gelinkt, also geb ich die ganzen Header und die lib mit. Meine Klassen haben alle diese Exportdirektive, keine Ahnung ob man die braucht...Ist das nun schon das, was ihr als Klassenexport bezeichnet?

    Ja, genau das ist das.

    mib schrieb:

    Beim Versuch die Dll mit dem 6er Studio zu erstellen bekomm ich jede Menge warnings vom Typ C4251(das die ganzen stl basisklassen ein dll-interface brauchen um von den dll clients benutzt werden zu können...)
    Meine Dll macht zwar das was sie soll, aber am Ende beim Freigeben des Speichers rummst es...ich weiss nicht so richtig was ich falsch mache, im 7er Studio klappt es ja schliesslich auch... 😞

    Siehe: STL std::string class causes crashes and memory corruption on multi-processor machines
    http://support.microsoft.com/default.aspx?scid=kb;en-us;813810

    Siehe: Microsoft Visual Studio .NET 2003 Warning C4251
    http://www.unknownroad.com/rtfm/VisualStudio/warningC4251.html


Anmelden zum Antworten