Guybrush Threepwood Geschrieben 12. Mai 2003 Geschrieben 12. Mai 2003 Hi, ich habe eine Funktion in einer Dll die ein char*** übergeben bekommt und dafür ein 2 dim. Array reserviert und mit Werten füllt. Wenn ich dann aber den Speicher in der Exe wieder mit free() freigeben will, bekomme ich eine Accessviolation. Wenn ich mir die Funktion aber in die Exe kopiere und nicht aus der Dll lade , funktioniert es einwandfrei.:confused: Habt ihr ne Idee warum? Gruß Guybrush
Klotzkopp Geschrieben 12. Mai 2003 Geschrieben 12. Mai 2003 Die DLL und die EXE haben jeweils ihren eigenen Heap. Du allokierst auf dem Heap der DLL und gibst auf dem Heap der EXE frei. Du kannst das vermutlich verhindern, indem du für DLL und EXE dieselbe DLL-Version der C-Runtime verwendest. Nicht zuletzt vom Design-Standpunkt gesehen, ist es aber wahrscheinlich besser, wenn die EXE den Speicher selbst holt. --> Verschoben: C++: Compiler, IDEs, APIs
Guybrush Threepwood Geschrieben 12. Mai 2003 Autor Geschrieben 12. Mai 2003 Original geschrieben von Klotzkopp Nicht zuletzt vom Design-Standpunkt gesehen, ist es aber wahrscheinlich besser, wenn die EXE den Speicher selbst holt. Das ist leider nicht möglich, die Funktion bekommt nämlich noch einen String übergeben und splitten diesen anhand eines Zeichens auf und verteilt die einzelnen Teile in das 2 dim. Array. Du kannst das vermutlich verhindern, indem du für DLL und EXE dieselbe DLL-Version der C-Runtime verwendest. Kannst du das mal genauer erklären?
Klotzkopp Geschrieben 12. Mai 2003 Geschrieben 12. Mai 2003 Original geschrieben von Guybrush Threepwood Das ist leider nicht möglich, die Funktion bekommt nämlich noch einen String übergeben und splitten diesen anhand eines Zeichens auf und verteilt die einzelnen Teile in das 2 dim. Array.Das ist eigentlich immer möglich. Die DLL kann ja einen Fehlercode zurückgeben, wenn der von der EXE übergebene Speicher nicht groß genug ist. Kannst du das mal genauer erklären? Deine DLL und deine EXE verwenden die C-Laufzeitumgebung. Das ist eine Bibliothek, die sich u.a. um den Heap kümmert. Es gibt sie (bei MSVC) in drei Versionen: Single-threaded, Multi-threaded und Multi-threaded DLL. Dazu gibt es jeweils noch eine Debug-Version. Nur die letzte kann man dynamisch linken, d.h. in allen anderen Fällen hast du zwei Laufzeitumgebungen, eine in der EXE und eine in der DLL, und damit auch zwei Heaps. Nur wenn beide die Multi-threaded DLL-Version verwenden, teilen sie sich eine Laufzeitumgebung, und damit auch einen Heap. Die Einstellung, welche Laufzeitbibliothek verwendet werden soll, findest du bei MSVC in den Projekteinstellungen unter C/C++->Code Generation.
Guybrush Threepwood Geschrieben 12. Mai 2003 Autor Geschrieben 12. Mai 2003 Original geschrieben von Klotzkopp Das ist eigentlich immer möglich. Die DLL kann ja einen Fehlercode zurückgeben, wenn der von der EXE übergebene Speicher nicht groß genug ist. Das wäre aber etwas umständlich finde ich. Die Einstellung, welche Laufzeitbibliothek verwendet werden soll, findest du bei MSVC in den Projekteinstellungen unter C/C++->Code Generation. Das müßte dann ja bei jedem Projekt eingestellt werden das die Funktion benutzen will. Ich glaube dann schreibe ich die Funktion anstatt in die DLL, in die dazugehörige Headerdatei. Dann sollte es ja keine Probleme geben. Danke! Gruß Guybrush
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden