Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

  • Autor
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?

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.

  • Autor
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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.