Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Tracert

Treue Seele

  • »Tracert« ist der Autor dieses Themas

Beiträge: 108

Wohnort: Braunschweig

Beruf: Student

  • Private Nachricht senden

1

29.07.2003, 02:16

Ich dreh am Rad: Probleme mit Funktionen aus DLLs

Hallo!

Melde mich mal wieder mit alten Problemen bei Dingen, die eigentlich ganz einfach sein sollten. Ich schreibe für meine kleine Engine (oder das, was es mal werden soll ;) einige LogFile-Funktionen. So, die Init- und Exit-Funktionen klappen auch soweit. Nun kann man mit diesen allein nicht viel anfangen, also habe ich natürlich eine Write-Funktion hinzugefügt, mit der man einen Text in die LogDatei schreiben kann.

So, nun kommts: Jedes mal wenn ich die Funktion aus dem Hauptprogramm aufrufe bekomme ich folgende Fehlermeldung:

Debug Assertion Failed
Program: (der Pfad zu meinem Programm)
File: dgbHeap.c
Line: 1132
Expression: _CrtIsValidHeapPointer(pUserData)

Ich dachte erst an einen Fehler in der Funktion. aber das geile ist noch, selbst wenn die Funktion gar nichts macht außer 0 zurückzugeben, erscheint dieser Fehler, also immer wenn ich sie nur aufrufe. Kommentier ich sie im Hauptprogramm aus, klappt alles wunderbar.

Die Write-Funktion ist genau wie die beiden anderen exportiert. Die DLL ist diesmal wirklich definitiv undn hundertprozentig aktuell. Woran kann dieser Fehler liegen? ???

Ich danke schonmal!
TR

Tracert

Treue Seele

  • »Tracert« ist der Autor dieses Themas

Beiträge: 108

Wohnort: Braunschweig

Beruf: Student

  • Private Nachricht senden

2

29.07.2003, 02:29

Hab etwas näheres herausgefunden: Die Write-Funktion erwartet einen Parameter vom Typ string. Änder ich diesen Parameter auf char *, so funktioniert auf einmal alles. Ich bin jetzt erstmal mit den <string>s fertig. Eigentlich hielt ich das ganze mal für praktisch und schön einfach, aber wenn mir nicht jemand erklärt, warum das nicht funktioniert, schmeiße ich die über Bord und schreibe mir was eigenes. Kann ja wohl echt nicht sein, so ein Schund. Und damit halte ich mich nächtelang auf!

TR

PS: Außerdem erwartet die Init-Funktion auch einen Parameter vom Typ string, warum geht das denn da? Also ich weiß jetzt gar nichts mehr...

3

29.07.2003, 15:47

Schick mal den code (wenn er zu groß ist, per E-Mail). Hast Glück, dass ich gerade Bock drauf hab'. ;D
Ein Gespenst geht um in Europa...

4

30.07.2003, 03:34

Hehe, du hast das Typische Problem das so gut wie alle haben, die eine ganz wichtige sache nicht Wissen. Das ist, das die DLL einen eigenen Speicherbereich verwendet. Das heißt z.B. wenn du Speicher in deiner DLL reservierst und diesen Speicher dann in der EXE freigibst, kommt genau diese Meldung.

Ich kenne zwar nich deine Funktion, aber ich gehe einfach mal davon aus, das der std::string Parameter in der DLL Funktion verendert wird. Das ganze läst sich leicht lösen, deine DLL must du als Multithreaded-DLL Kompilieren. Dann hast du auch keine Probleme mehr. Schöner nebeneffekt dabei ist, das deine DLL auch gleich ein bissel kleiner wird.

PS: Falls man eine Zeichenkette einfach nur übergeben möchte, aber nicht verendern. Dann immer const std::string& als Parameter verwenden. Dann gibt es auch keinerlei schwierigkeiten.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Tracert

Treue Seele

  • »Tracert« ist der Autor dieses Themas

Beiträge: 108

Wohnort: Braunschweig

Beruf: Student

  • Private Nachricht senden

5

31.07.2003, 00:29

:huhu:
OK, ich weiß vieles noch nicht. Ich will nicht behaupten, dass ich C++ schon besonders gut kann und vor allem mit dem System hinter DLLs habe ich mich noch nicht eingehend beschäftigt. Vor allem sollte ich mir aber abgewöhnen, immer hauptsächlich mitten in der Nacht zu proggen. Da hab ich zwar die besten Ideen, aber an der Umsetzung hapert es immer. ;)

OK, aber vielleicht hilfst du mir ja noch auf die Sprünge: Wie kompiliere ich eine DLL als Multithreaded? Bzw. wo kann ich da im Internet vielleicht Infos drüber finden, wenn du das grad nicht erklären willst?

Hast zwar recht, bei diesen Funktionen will ich wirklich nur einen string übergeben, der nicht verändert werden soll, er wird stattdessen in einen anderen String kopiert und in diesem dann weiterverarbeitet, ergänzt usw., also werd ich das mit dem const string& mal probieren. Aber da man nie weiß was kommt, bräuchte ich die Option des Multithreaded vielleicht doch nochmal...

@progger: Danke für das Angebot, aber ich probier erstmal DragonMasters Tipps. ;)

Danke und bis dann!
TR

Tracert

Treue Seele

  • »Tracert« ist der Autor dieses Themas

Beiträge: 108

Wohnort: Braunschweig

Beruf: Student

  • Private Nachricht senden

6

31.07.2003, 00:35

Es klappt, es klappt!

Hab ich schon erwähnt dass ich grade je ein Buch für C++ und VC++.net im speziellen bei Amazon bestellt habe? ;)

Bis dann!
TR

7

31.07.2003, 01:48

Multithreaded-DLL ist eine Compiler-Option. Du findest sie in den Einstallungen des Projektes C/C++ -> Codeeinstellungen und dann bei den "Laufzeiteinstellungen". Dort gibt es die beiden Optionen "Multithreaded-DLL" und "Multithreaded-Debug-DLL" für den Debug Version des Projektes.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige