Ausnahme beim Schließen des Programms
-
Hallo,
wenn ich bei meinem MDI (Doc/View)-Projekt das Child- oder Main-window schließe, tritt eine Ausnahme(0xC00000005) beim Lesen an einer Position 0x... auf. Das Disassably zeigt an der Stelle (sowie eigentlich nur) "???" an.
Beim Schließen mache ich eigentlich kaum etwas. Das Problem zeigt sich wohl bei einer delete Anweisung. Im Destruktor des Docs hab ich mal debuggt. In einer Klasse, die im Doc erzeugt ist, ist ein bool* deklariert:class myClass { ... bool* m_bSelectAry; }
nun wird im Konstrktor von myClass noch ein Feld drangehängt:
myClass::myClass() { m_bSelectAry = new bool[10];}
im Destruktor von myClass lösche ich dann das Feld so:
myClass::~myClass() { delete [] m_bSelectAry; }
mache ich ein einzelschritt in delete, erscheint die Fehlermeldung nachdem ich aus delete wieder rausspringe, sonst nachdem ich aus dem Destruktor "rausspringe".
Dieser Fehler tritt allerdings nur sporadisch auf. manchmal kommt garnichts, dann wieder die Fehlermeldung und manchmal wird ein Stück code angezeigt (was, variiert aber auch). Also ziemlich blöder Fehler. Hat jemand eine Idee, was ich falsch mache?
Grüße
Micha
-
Sieh mal nach, was Du mit m_bSelectAry alles vor den Destruktor machst. Problier mal:
myClass::~myClass() { if(m_bSelectAry !=NULL) delete [] m_bSelectAry; }
-
Könnte es sein, dass Du evtl. die Klasse myClass selbst zweimal per delete entsorgst?
Evtl. ist der Zeiger auf myClass nicht initialisiert!
-
Hallo Tester2,
danke für deine Antwort. Ich konnt den Fehler jetzt auf einen anderen Bereich eingrenzen. zusammen mit dem Doc habe ich eine Klasse erzeugt, die mit einem Chipkartenleser arbeitet. Zum verwenden des Chipkartenlesers werden zwei dlls benutzt: SCard32.dll und noch eine, die die SCard32.dll benutzt. Ich lade im c'tor der Klasse die SCard32.dll mit LoadLibrary(); dabei erscheint dann im Ausgabefenster von VS schon "Eine Ausnahme (Erste Chance) bei ... in meine.exe ...". Das hab ich alles immer ignoriert, weil sowas ja auch bei Propertypages auftritt... . Jedenfalls hat das Arbeiten mit der Klasse immer funktioniert. Im Destruktor der Klasse wird die SCard32.dll mit FreeLibrary() freigegeben. Dabei schmiert dann mein Programm ab (mit der Meldung vom ersten Beitrag). Lasse ich FreeLibrary() weg, ist alles i.O.
Frage: Ist die dll Fehlerhaft, wenn bei LoadLibrary Ausnahmen auftreten?
Ist es schlimm, wenn ich FreeLibrary weglasse?Ich hab gerade etwas die MSDN durchstöbert und gesehen, man solle doch AfxLoadLibrary und AfxFreeLibrary verwenden. Das habe ich nun versucht und nachdem ich auch
#define _AFXDLL #include "afxdll_.h"
gesetzt hatte kommt beim Verknüpfen die Meldung, das AfxLoadLibrary nicht gefunden wurde (nicht aufgelöster externer Verweis) was muss ich denn noch machen, um damit zu arbeiten? Sind die Afx-Sachen nur für MFC-Dlls? SCard32.dll ist keine MFC-dll.
Micha
-
Tester2 schrieb:
Sieh mal nach, was Du mit m_bSelectAry alles vor den Destruktor machst. Problier mal:
myClass::~myClass() { if(m_bSelectAry !=NULL) delete [] m_bSelectAry; }
delete auf eien 0 Zeiger ist immer erlaubt. Dieser Test kann nichts nützen.
-
Wenn beim FreeLibrary ein Crash auftritt ist zu vermuten, dass in der DLL etwas schief läuft. Evtl. hast Du etwas in der DLL benutzt was Du auch wieder freigeben musst... So ein Open/Close Sandwich wurde evtl. von Dir nicht beachtet.
AfxLoadLibrary/AfxFreeLibrary muss man nur benutzen, wenn man.
1. Eine MFC DLL hat
2. EXE und DLL beide die DLL Version der MFC benutzen.
3. Nur dann, wenn man mehrere Threads hat, die DLLs unabhängig laden und entladfen können. Hat man nur einen Main Thread kann die Nicht-Nutzung kaum böses anrichten.
-
von freigenen habe ich nichts gelesen. Doku zur dll siehe: http://btp2x1.phy.uni-bayreuth.de/archive/public/documents/manuals/it/Doku%20Hardware/Scard-d.pdf (Seite 5)
realisierung bei mir sieht so aus://in SCard.h *einzige* Funktion, die aus dll benötigt wird typedef long(CALLBACK* SCardComand)(long handle, char* Cmd, long CmdLen, char* DataIn, long* DataInLen, char* DataOut, long* DataOutLen); //in c'tor m_hDLL = LoadLibrary(_T("SCard32.dll")); if(m_hDLL) { pFkSCardComand = (SCardComand)GetProcAddress(m_hDLL,"SCardComand"); } //in d'tor if(m_hDLL) FreeLibrary(m_hDLL);
Selbst wenn ich nur c'tor und d'tor durchlaufe, ohne überhaupt was zu machen hängt sich mein Programm auf. Wie gesagt: Fehlermeldungen in der Ausgabe gibts schon ab LoadLibrary und alles läuft bis auf FreeLibrary()
-
Dann könnte ist diese DLL evtl. buggy und zerstört Deinen Heap. Oder Du rufst pFkSCardComand mit falschen Parametern auf, oder mit einer falschen Argument.
Was passiert, wenn Du direkt hintereinander Load/FreeLibrary machst?
Zu der First Chance Exception: Das ist kein Problem. Es gibt zwar eine Exception aber Deine Software (die DLL) behandelt diese Exception...
Diese Meldung ist nur hilfreich im Debugger, der bekommt die Exception zuerst angeoten, reicht diese aber weiter an den Handler.
-
Wenn ich Load/Free-Library hintereinander mache kommt der gleiche Fehler (aber andere Adresse).
Das die DLL (und noch andere) Entladen wurden wird im Ausgabefenster angezeigt bevor der Fehler auftritt.Micha
-
Tja...
Schei<zensiert>...</zensiert> DLL.ASSERT(AfxCheckMemory());
vor dem LoadLibrary meldet nichts böses?
Lädt die DLL sonst nichts.Anosnten würde ich sagen: Wende Dich an den Entwickler...
-
AfxCheckMemory() meldet auch nichts böses vor oder nach LoadLibrary()
wenn die dll geladen wird, erschein folgendes im Ausgabefenster:"ZFG_2.exe": "C:\WINDOWS\system32\SCard32.dll" geladen, Die Binärdaten wurden nicht mit Debuginformationen erstellt. "ZFG_2.exe": "C:\WINDOWS\system32\winscard.dll" wurde geladen "ZFG_2.exe": "C:\WINDOWS\system32\wtsapi32.dll" wurde geladen "ZFG_2.exe": "C:\WINDOWS\system32\winsta.dll" wurde geladen "ZFG_2.exe": "C:\WINDOWS\system32\netapi32.dll" wurde geladen "ZFG_2.exe": "C:\WINDOWS\system32\cfgmgr32.dll" wurde geladen "ZFG_2.exe": "C:\WINDOWS\system32\setupapi.dll" wurde geladen "ZFG_2.exe": "C:\WINDOWS\system32\MCSCM.dll" geladen, Die Binärdaten wurden nicht mit Debuginformationen erstellt. "ZFG_2.exe": "C:\WINDOWS\system32\ntmarta.dll" wurde geladen "ZFG_2.exe": "C:\WINDOWS\system32\samlib.dll" wurde geladen "ZFG_2.exe": "C:\WINDOWS\system32\wldap32.dll" wurde geladen Eine Ausnahme (erste Chance) bei 0x7c812aeb in ZFG_2.exe: Microsoft C++-Ausnahme: unsigned long an Speicherposition 0x0011bf5c.. Eine Ausnahme (erste Chance) bei 0x7c812aeb in ZFG_2.exe: Microsoft C++-Ausnahme: [rethrow] an Speicherposition 0x00000000..
Na gut,
dann trotzdem danke für deine Zeit
Micha