Speichern ueber Serialize Dateizugriff verwehrt!
-
Ich versuche wie folgt eine WindowsMetaFile zu speichern:
void CMGrafikDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { ar.GetFile()->SeekToBegin(); //Funktioniert (Mehrmals mit Fehler o.O) HMETAFILE MetaFileHandle = pMetaFileDC->Close(); CopyMetaFile(MetaFileHandle, ar.GetFile()->GetFilePath()); CMetaFileDC *tmpMeta = new CMetaFileDC(); tmpMeta->Create(); tmpMeta->PlayMetaFile(MetaFileHandle); DeleteMetaFile(MetaFileHandle); delete pMetaFileDC; pMetaFileDC = tmpMeta; } else { HMETAFILE MetaFileHandle = GetMetaFile(ar.GetFile()->GetFilePath()); CMetaFileDC *tmpMeta = new CMetaFileDC(); tmpMeta->Create(); tmpMeta->PlayMetaFile(MetaFileHandle); DeleteMetaFile(MetaFileHandle); delete pMetaFileDC; pMetaFileDC = tmpMeta; } //pMetaFileDC->Serialize(ar); CMGrafikDoc::Serialize(ar); }
Das Problem was sich mir jedoch ergibt ist:
sobald er zu dem aufruf kommt CMGrafikDoc::Serialize(ar); stuerzt das ganze Programm unvermittelt ab. Wenn ich die Stelle auskommentiere "speichert" er zwar die MetaFile aber um richtig zu speichern muss ich erst erneut auf speichern druecken und dann kommt zugriff verwehrt...danke im vorab.
mFg redw0lf
-
weis keiner is wichtig -.-
ueber des standard von dem archiv ar << pMetaFileDC geht es auch nicht.
-
Wieso rufst du denn die Serialize-Methode rekursiv auf? Das gibt doch ne Endlosschleife?!?
Außerdem hast du Memoryleaks, weil du jedesmal neuen Speicher für tmpMeta reservierst, aber nie freigibst.
Dafür weist du dem Zeiger pMetaFileDC eine Adresse zu, obwohl du seinen Speicherplatz davor freigegeben hast...
Also meiner Meinung nach ist da einiges nicht in Ordnung...
-
der rekursive aufruf war schon vorher da drinne seit erstellung. sprich ist von microsaft.
pmetafiledc ist lediglich eine member variable
ein pointer der klasse cmetafiledc. ihm wird einmal im konstruktor ein wert zugewiesen per new so und lediglich das element was da an der addresse haengt wird geloescht. memoryleaks duerften so nicht enstehen.ich lösche quasi immernur den zeiger und weise ihn einen neuen wert zu, der dasselbe wie davor beinhaltet. ist zwar doof wüsste aber nicht wie ich das sonst machen sollte.