FreeLibrary() löst Fehler aus !?
-
ich weis jetzt woran es liegt, kann es mir aber nicht erklären:
ich habe durch zufall gerade an einem andern projekt gearbeitet, indem ich eine klasse verwende, die ich auch in der DLL benutze. das programm hat aber nichts mit der DLL zu tun.
ich benutze in dem programm keine libs o.ä. fremdes. es kommt aber jetzt der selbe fehler wie in der DLL, der nach dem aufruf von delete erscheint.
das objekt, bei dem der fehler beim delete kommt erzeuge ich so:
CXTSequence xSeqTmp = new CXTSequence(); CFile fFile; fFile.Read(xSeqTmp, sizeof(CXTSequence));das auslesen aus der datei dürfe doch nicht den fehler verursachen, oder ? anderes wird aber nicht mit dem objekt gemacht.
-
Das Problem ist, dass in der EXE Speicher allokiert (z.B. via CFile.Read) wird der in der DLL wieder freigegeben wird!!!
Das ist *nur* dann zulässig, wenn die DLL und die EXE die gleiche (shared) CRT verwenden!!!
Also Du *musst* die DLL und die EXE mit der gleichen DLL-version der CRT linken!
-
ich benutze doch schon die selbe CRT. aber das problem tritt doch auch im programm ohne die DLL auf.
daher muss das problem ja woanders liegen, oder siehst du das anders ?
-
Dann mach mal ein "MInimalprogramm" wo der Fehler aufritt und mail sie mir zu

-
ich habe gerade das "miniprogramm" gebastelt und es lief. zum testen hatte ich einfach nur ein objekt erzeugt, in ein CObArray gepackt und die klasse in der das CObArray enthalten ist gelöscht.
daraufhin habe ich meine unbearbeiteten klassen (hatte die ja für das miniprogramm geändert) ins programm eingebunden und es lief auch. dann habe ich das im test erzeugte objekt über CFile eingelesen (also speicher erzeugt und mit CFile::Read() die infos aus der datei im objekt gespeichert). dann trat der beschriebene fehler auf.
ich hoffe die fehlerbeschreibung hilft auch weiter, da die abgespeckte version nichts nützen würde. ich kann mir den fehler aber nicht erklären, da ich doch den speicher selbst erzeuge, und er doch nur von CFile benutzt wird !?
-
Ist CXTSequence eine "Klasse" oder ein POD? PODs kannst du so schreiben/lesen wie du das machst (solange sie keine Zeiger/Handles/... enthalten), "echte Klassen" nicht.
-
CXTSequence ist eine klasse, die enthält nur zwei variablen (keine handles ö.ä.) und eine funktion.
dann muss ich das wohl anders machen mit dem einlesen. danke für die hilfe !! dann weis ich jetzt weiter

-
Red Skall schrieb:
ich habe gerade das "miniprogramm" gebastelt und es lief. zum testen hatte ich einfach nur ein objekt erzeugt, in ein CObArray gepackt und die klasse in der das CObArray enthalten ist gelöscht.
daraufhin habe ich meine unbearbeiteten klassen (hatte die ja für das miniprogramm geändert) ins programm eingebunden und es lief auch. dann habe ich das im test erzeugte objekt über CFile eingelesen (also speicher erzeugt und mit CFile::Read() die infos aus der datei im objekt gespeichert). dann trat der beschriebene fehler auf.
ich hoffe die fehlerbeschreibung hilft auch weiter, da die abgespeckte version nichts nützen würde. ich kann mir den fehler aber nicht erklären, da ich doch den speicher selbst erzeuge, und er doch nur von CFile benutzt wird !?
Dumusst in jedem Fal den Serialisierungsmechanismus der MFC verwenden. Was sind das für Objekte und wie schreibst Du sie. Es geht in keinem Fall einfach. das Objekt einzulesen und gnadenlos das Speicherimage zu überschreiben. Da gehenja die vtable Pointer flöten...
-
also ich erzeuge die CXTSequence-objekte mit new und schreibe sie über CFile::Write() in die datei:
CObArray oSequences; CXTSequence *xSequenceTmp; CFile fFile; // Sequenzen in Datei schreiben: for (INT_PTR u = 0; u < oSequences.GetCount(); u ++) { xSequenceTmp = (CXTSequence*) oSequences.GetAt(u); fFile.Write(xSequenceTmp, sizeof(CXTSequence)); }die klasse ist wie folgt aufgebaut:
class CXTSequence : public CObject { public: CXTSequence (); CXTSequence (INT_PTR iBMPIndex, int iFrames); public: void operator = (CXTSequence &xSeq); public: INT_PTR iBMPIndex; int iFrames; };das das speicherimage nicht zu überschreiben ist leuchtet total ein. hatte serialisierung noch nie benutzt aber mich mal etwas eingelesen. du meinst ich soll das mit CArchive und Serialize() schreiben / lesen !?
-
Und genau das geht nicht!
Versteh doch das CObject kene pure Datenklasse ist. Da ist mindestens ein vtable Zeiger drin.Verwende die Serialze Funktion der CObject Klasse!
-
ich habe das doch schon verstanden
. ich habe nur geschrieben wie ich gemacht habe, habe noch nicht weiter gemacht am programm.habt mir aber sehr weiter geholfen, danke euch !!

-
habe jetzt doch noch ein frage:
ich kann wunderbar meine objekte mit allen werten lesen und schreiben.
ich benutze die klasse mit der ich serialisiere in meiner dialogfeldklasse. dort will ich auf die werte zugreifen, aber es werden nur ungültige werte angezeigt.
es scheint so als ob ich von der dialogfeldklasse nicht auf die korrekten werte zugreifen kann. muss ich da irgendwie meiner dialogfeldklasse noch etwas "bekannt machen" o.ä. ?
EDIT:
das lag jetzt an mir, sorry

klappt wunderbar !!