Heap in verdacht
-
das problen ist behoben
also er stürtzte doch immer nach dem zweiten mal ab. dann habe ich an verschiedenen stellen breaks gesetzt. schuld war, das ich eine BYTE* variable mit 'delete' ausm speicher raus haben wollte, dann ist er komischer weise abgestürtzt. in der variablen waren die clipboard-daten drin.
jetzt mache ich es anders und es geht
danke trotzdem
-
Tja, du solltest nur Sachen delete'n, die du auch per new reserviert hast, sonst bekommst du leichte Probleme.
(und wenn es nichts anderes sagt, ist das Clipboard vermutlich selbst dafür zuständig, die alten Inhalte zu entsorgen)
-
den speichert hatte ich mit new angelegt. eigentlich dürfe das clipboars auch nichts damit zu tun haben. warum es damit nicht geklappt hat würde ich auch gerne wissen
-
Red Skall schrieb:
warum es damit nicht geklappt hat würde ich auch gerne wissen
dann zeig doch mal den alten code...
-
das hier ist die struktur, in der die informationen stehen:
struct MRTClipboardData { MRTClipboardData() { uFormat = 0; iLength = 0; bData = NULL; } UINT uFormat; BYTE *bData; int iLength; };
so lese ich aus dem clipboard:
BOOL CMyRemoteToolDlg::ReadClipboardData(MRTClipboardData *mClipData) { HANDLE hHandleTmp; if (CountClipboardFormats() == 0) return (FALSE); else if (OpenClipboard() == FALSE) return (FALSE); hHandleTmp = GetClipboardData(CF_TEXT); if (hHandleTmp != NULL) { LPSTR lStrTmp; lStrTmp = (LPSTR) ::GlobalLock(hHandleTmp); mClipData->iLength = strlen(lStrTmp); mClipData->bData = new BYTE[mClipData->iLength]; mClipData->bData = (BYTE*) lStrTmp; mClipData->uFormat = CF_TEXT; ::GlobalUnlock(hHandleTmp); CloseClipboard(); return (TRUE); } CloseClipboard(); return (FALSE); }
vorher habe ich die struktur nicht der funktion übergeben, sonder als membervariable deklariert. vor der benutzung innerhalb der funktion habe ich 'bData' mit delete gelöscht. dabei ist er dann abgestürtzt.
das muss ich jetzt nicht machen, da ich mit nur temporär mit 'MRTClipboardData' arbeite, ist also nur in einer funktion gültig.
-
Red Skall schrieb:
... mClipData->bData = new BYTE[mClipData->iLength]; mClipData->bData = (BYTE*) lStrTmp; ... }
...innerhalb der funktion habe ich 'bData' mit delete gelöscht. dabei ist er dann abgestürtzt.
'bData' zeigt ja auch nicht mehr auf das byte array, sondern auf 'lStrTmp'
-
hmm, haste eigentlich recht. die zeile kann ich mir auch eigentlich sparen.
glaube ich weis warum er abgestürtzt ist:
- funktion wird das erste mal aufgerufen
- lStrTmp wird in bData gespeichert- funktion wird das zweite mal aufgerufen
- delete bData wird aufgerufen:
aber der inhalt der im speicher erwartet wird existiert gar nicht mehrdann stürtzt er ab. korregier mich wenn ich falsch liege
-
Red Skall schrieb:
glaube ich weis warum er abgestürtzt ist:
- funktion wird das erste mal aufgerufen
- lStrTmp wird in bData gespeichertfast: bData wird auf lStrTmp umgebogen
- funktion wird das zweite mal aufgerufen
- delete bData wird aufgerufen:
aber der inhalt der im speicher erwartet wird existiert gar nicht mehrDer Inhalt könnte durchaus noch existieren, allerdings stammt dieser Speicher nicht von new, sondern von GlobalLock().
Besser wäre es wohl, die Daten in deinen Datenbereich zu kopieren:
mClipData->bData = new BYTE[mClipData->iLength+1];// '\0' nicht vergessen ;) strcpy(mClipData->bData,lStrTmp);
-
werds mal probieren. wenn ich mich richtig erinnere stammt der code aus der MSDN
, habe ihn kopiert
versuche es mal so
-
also so gehts auch, werde es so lassen, weils besser ist
danke