Vektor in DLL funktioniert nur 1 Mal



  • Hallo an ALLE,

    ich versuche gerade, einige meiner Methoden aus meinem Programm in DLLs auszulagern. Die Methoden funktionieren in der EXE-Datei alle einwandfrei.
    Dazu muss ich noch erwähnen, dass ich als Übergabe-Parameter für die Methoden Referenzen auf Vektoren verwende, deren Größe ich in den Methoden zur Laufzeit ständig anpasse.

    Wenn ich die jeweilige Methode aber nun in die DLL auslagere und verwende, dann kann ich sie immer nur ein einziges Mal ohne Probleme aufrufen. Danach kann ich die Methode zwar nochmals aufrufen, jedoch wird beim erneuten Versuch einen Vektor in der Größe anzupassen, eine Exception ausgelöst.

    Die DLLs lade ich zur Laufzeit beim Start des Programms und entlade sie beim Beenden.

    Hat jemand eine Idee wo das Problem sein könnte und wie ich es lösen kann? 😕

    Vielen Dank im Voraus

    Gruß
    Andreas



  • Hallo,

    hast Du denn überprüft, ob die Referenzen noch gültig sind? Nur weil Referenzen sicherer als eiger sind, heißt das nicht, daß sie sicher sind.

    mfg Martin
    P.S.: Poste doch mal einen Code von der Stelle, wo die Exception ausgelöst wird.



  • Sind dll und exe mit exakt der gleichen Compilerversion kompiliert und linken exakt die gleiche Version der Runtime und verwenden exakt die selben Präprozessorflags bezüglich der Standardbibliothek (iterator debugging etc.)?



  • Hallo!

    Vielen Dank für Euro Antworten.

    Also ich habe eure Vorschläge und noch diverse andere Sachen versucht und geprüft. Alles ohne Erfolg. Habe auch schon mal auf Zeiger umgestellt. Geht auch nicht.

    Aus lauter Verzweifelung habe ich dann ein Testprogramm geschrieben, welches nichts anderes macht, als die DLLs dynamisch zu laden und mir Zugriff auf die Methoden
    zu verschaffen. Und was soll ich sagen, damit funktioniert es einwandfrei. 😕

    Dann habe ich versucht herauszufinden, was jetzt sooooooooooo anders an dem Test-Programm ist.
    Der Unterschied ( der einzige den ich gefunden habe ): Das "Test-Programm" verwendet Laufzeit-Packages und mein "normales" nicht. Also habe ich mal versucht, die Packages in meinem "normalen" Programm auch mal nur zur Laufzeit zu laden. Dann läuft es zwar, kann dann aber beim Beenden die DLLs nicht entladen und bleibt hängen.

    Hoffentlich hat da noch jemand eine Idee.

    Vielen Dank

    Gruß
    Andreas



  • Ich denk das Problem ist hier eben der CLR Heap. DLL und EXE müssen die selbe dynamische Runtime linken. Denn wenn sie das nicht tun, dann haben DLL und EXE getrennte Heaps und ein delete auf etwas, was im jeweils anderen Modul mit new erzeugt wurde, wird crashen. Und sowas ist schnell mal passiert wenn std:: Zeugs zwischen DLL und EXE herumwandert...



  • Hallo dot.

    Kannst du mir denn auch sagen wie ich dass veranlassen kann, dass sie die selbe dynamische Runtime linken.
    Keine Ahnung wie und wo ich das anstelle. 😕

    Vielen Dank

    Gruß
    Andreas



  • C/C++ > Code Generation > Runtime Library



  • Hallo dot.

    Bei Visual Studio finde ich diese Einstellungen in den Projekteigenschaften wie du es beschrieben hast. Jedoch benutze ich den Borland C++ Builder 2006.

    Gruß
    Andreas



  • Projektoptionen -> Linker -> Linken -> Dynamische RTL verwenden
    Projektoptionen -> Packages -> laufzeitpackages verwenden

    Es scheiden sich zwar da die Geister aber ich achte darauf, dass Speicher der von Modulen angefordert wird auch dort verbleibt und nicht "hin- und herwandert". Wenn man portable DLLs schreiben will ist das ein Muss. Man kann dann aber im Allgemeinen keine komplizierten Datenstrukturen zwischen den Modulen hin- und herschieben (dazu gehören auch die Vektoren)



  • Wenn man portable DLLs schreiben will dann ist C++ im Interface sowieso ein no-go. Dann ist C oder COM angesagt...



  • Hallo.

    Vielen Dank.
    Ich werde mein Glück versuchen. Ich berichte dann was daraus geworden ist.

    Gruß
    Andreas


Anmelden zum Antworten