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 Zitieren
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 Zitieren
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? Zitieren
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. Zitieren
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 Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.