wulfgang Geschrieben 19. Februar 2009 Teilen Geschrieben 19. Februar 2009 Moin,ich bekomme von meinem Programm(Konsolenanwendung unter VisualStudio geschrieben), wenn ich das Programmfenster wieder schließen will, als erstes die Meldung: Debug Error! Program: ... R6025 -pure virtual function call (press etry to debug the application) Das Problem ist ein CInternetSession Objekt. Bin leider noch nicht ganz dahintergekommen, wie ich den Fehler beseitige. Ich weiß, dass der Fehler nur auftaucht wenn ich CInternetSession session((_T("My FTP Session")),1, INTERNET_OPEN_TYPE_PROXY ,(_T( "proxy")), NULL, 0); außerhalb einer Methode erzeuge also z.B in einer Source: CInternetSession session((_T("My FTP Session")),1, INTERNET_OPEN_TYPE_PROXY , (_T( "proxy")), NULL, 0); Connect::Connect(void) {} Kommt der Fehler daher, dass ich session erst zerstören muss? Aber einfach nur delete(session) in der aufrufenden Umgebung funktioniert nicht. Session ist in der aufrufenden Umgebung nicht bekannt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 19. Februar 2009 Teilen Geschrieben 19. Februar 2009 Kommt der Fehler daher, dass ich session erst zerstören muss?Der Fehler rührt vermutlich daher, dass session erst dann zerstört wird, wenn es dafür eigentlich zu spät ist. Das kommt dabei raus, wenn man statt eines ordentlichen Designs globale Variablen benutzt. Aber einfach nur delete(session) in der aufrufenden Umgebung funktioniert nicht.Delete darfst du auch nur mit Objekten machen, die du mit new angelegt hast. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
FinalFantasy Geschrieben 19. Februar 2009 Teilen Geschrieben 19. Februar 2009 Pure Virtual Function call heisst, dass du eine Funktion aufrufst, die zwar definiert, aber nicht implementiert ist. Da es beim Beenden passiert, tippe ich auf einen Fehler im Destruktor deiner CInternetSession, dazu hast du aber leider keinen Code gepostet. Wenn es bei CInternetSession kracht, wäre deren Innenleben interessant. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 19. Februar 2009 Autor Teilen Geschrieben 19. Februar 2009 Wenn es bei CInternetSession kracht, wäre deren Innenleben interessant Das habe ich von MFC schon fertig übernommen. Weiß denn jemand wie ich das Objekt rechtzeitig zerstöre? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 19. Februar 2009 Teilen Geschrieben 19. Februar 2009 Weiß denn jemand wie ich das Objekt rechtzeitig zerstöre? Indem du die Session weder global, noch static o.Ä. machst sondern einfach nur als Member von Connect. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 19. Februar 2009 Teilen Geschrieben 19. Februar 2009 Das ist jetzt der Punkt, der eigentlich vorher hätte passieren sollen: Das Design. Mach dir klar, welche Aufgaben, Lebenszeiten, Beziehungen und Besitzverhältnisse die einzelnen Klassen und Objekte haben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 19. Februar 2009 Autor Teilen Geschrieben 19. Februar 2009 Mach dir klar, welche Aufgaben, Lebenszeiten, Beziehungen und Besitzverhältnisse die einzelnen Klassen und Objekte haben Das Objekt session soll ja erst zum Ende des Programms zerstört werden. Gibt es denn keine Möglichkeit session so zu zerstören wie es jetzt ist? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 19. Februar 2009 Teilen Geschrieben 19. Februar 2009 Zuerst solltest du klären, ob das wirklich die Ursache des Problems ist. Wirf mal den Debugger an, und zeig den Callstack zum Zeitpunkt des Fehlers. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 19. Februar 2009 Autor Teilen Geschrieben 19. Februar 2009 Wie soll ich mir denn den Callstack anzeigen lassen? Der Debugger wirft zum Schluss aus: The thread 'Win32 Thread' (0xa40) has exited with code -1073741510 (0xc000013a). The thread 'Win32 Thread' (0xcf8) has exited with code -1073741510 (0xc000013a). 'test.exe': Loaded 'C:\WINDOWS\system32\msctf.dll', No symbols loaded. The program '[732] test.exe: Native' has exited with code 3 (0x3). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 19. Februar 2009 Teilen Geschrieben 19. Februar 2009 Wie soll ich mir denn den Callstack anzeigen lassen?Debug > Windows > Call Stack Oder Alt+7. Der Debugger wirft zum Schluss aus:Aber vorher zeigt er doch diese Fehlermeldung an, oder? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 19. Februar 2009 Autor Teilen Geschrieben 19. Februar 2009 (bearbeitet) Aber vorher zeigt er doch diese Fehlermeldung an, oder? Ja. Debug > Windows > Call Stack geht bei mir nicht. Habe stattdessen als Optionen zur Auswahl: Debug > Windows > Immediate Debug > Windows > Breakpoints Debug > Windows > Output Bei alt+F7 erhalte ich vom Debugger ebenfalls nur die oben von mir zitierte Ausgabe. Bearbeitet 19. Februar 2009 von wulfgang Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 19. Februar 2009 Teilen Geschrieben 19. Februar 2009 Debug > Windows > Call Stack geht bei mir nicht. Habe stattdessen als Optionen zur Auswahl: Debug > Windows > Immediate Debug > Windows > Breakpoints Debug > Windows > Output Dann läuft das Programm nicht mehr, d.h. du stehst mit dem Debugger nicht an der Stelle, an der der Fehler auftritt. Bei alt+F7 erhalte ich vom Debugger ebenfalls nur die oben von mir zitierte Ausgabe.Alt+7, nicht Alt+F7. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 19. Februar 2009 Autor Teilen Geschrieben 19. Februar 2009 Okay habe jetzt 1 zu 1 aus dem Fenster von vom Stack rauskopiert: > msvcr80d.dll!_NMSG_WRITE(int rterrnum=25) Line 198 C msvcr80d.dll!_purecall() Line 54 + 0x7 bytes C mfc80ud.dll!CSessionMapPtrToPtr::RemoveKey(void * hInternet=0x00cc0004) Line 75 C++ mfc80ud.dll!CInternetSession::Close() Line 475 C++ mfc80ud.dll!CInternetSession::~CInternetSession() Line 441 C++ test.exe!`dynamic atexit destructor for 'session''() + 0x28 bytes C++ msvcr80d.dll!doexit(int code=0, int quick=0, int retcaller=1) Line 553 C msvcr80d.dll!_cexit() Line 413 + 0xb bytes C msvcr80d.dll!__CRTDLL_INIT(void * hDllHandle=0x10200000, unsigned long dwReason=0, void * lpreserved=0x00000001) Line 389 C msvcr80d.dll!_CRTDLL_INIT(void * hDllHandle=0x10200000, unsigned long dwReason=0, void * lpreserved=0x00000001) Line 214 + 0x11 bytes C Hilft das irgendwie? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 19. Februar 2009 Teilen Geschrieben 19. Februar 2009 Hilft das irgendwie?Es zeigt zumindest, dass das Problem im Destruktor von CInternetSession auftritt. Die MSDN Library schreibt dazu (CInternetSession Class) If your Internet connection must be maintained for the duration of an application, you can create a CInternetSession member of the class CWinApp. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 19. Februar 2009 Autor Teilen Geschrieben 19. Februar 2009 Aber dann muss ich das Programm ja komplett umstricken. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 19. Februar 2009 Teilen Geschrieben 19. Februar 2009 Aber dann muss ich das Programm ja komplett umstricken.Deswegen sollte man sich über Designfragen ja auch vorher Gedanken machen, und nicht einfach drauf los frickeln. Vermutlich reicht es aus, wenn du deine Session als lokale Variable in main erstellst, und dort, wo du sie brauchst, eine Referenz darauf übergibst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 19. Februar 2009 Autor Teilen Geschrieben 19. Februar 2009 Kann ich ein Objekt als Referenz übergeben, oder muss ich das mit Zeigern? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
sxs Geschrieben 19. Februar 2009 Teilen Geschrieben 19. Februar 2009 Kann ich ein Objekt als Referenz übergeben, oder muss ich das mit Zeigern? Ja kannst du. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 20. Februar 2009 Autor Teilen Geschrieben 20. Februar 2009 Okay Referenzen übergebe ich ja normalerweise mit z.B konstruktor(&referenz) . Wie soll ich das denn hier anstellen:confused: Bisher sieht meine Klasse ungefähr so aus: Connect.h #pragma once #include <afx.h> #include <afxwin.h> #include <afxinet.h> class Connect { public: Connect(void); static CFtpConnection * Connect::getLastConnection(); static CFtpConnection *connection_pointer; ~Connect(void); }; Connect.cpp: CFtpConnection Connect::*connection_pointer=0; CFtpConnection* Connect::connection_pointer=NULL; CInternetSession session((_T("My FTP Session")),1, INTERNET_OPEN_TYPE_PROXY , (_T( "proxy")), NULL, 0); Connect::Connect(void) { try { //FTP-Verbindung wird eröffnet,Methode GetFtpConnection wird auf session angewandt, //connection wird auf zurückgegeben Zeiger gesetzt if(connection_pointer = session.GetFtpConnection(pstrServer, login, passwd, port, bPassive)) { cout << "Verbindung wurde aufgebaut\n"; } } //Fehleroutine catch (CInternetException* pEx) { cout<<"FEHLER : "<<GetLastError()<<endl; TCHAR sz[1024]; pEx->GetErrorMessage(sz, 1024); printf_s("ERROR! %S\n", sz); pEx->Delete(); } cout << "Test Konstruktor von Connect erfolgreich\n"; // if the connection is open, close it if (connection_pointer != NULL) { connection_pointer->Close(); //delete connection_pointer; } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 20. Februar 2009 Teilen Geschrieben 20. Februar 2009 Okay Referenzen übergebe ich ja normalerweise mit z.B konstruktor(&referenz). Nein, damit übergibst du die Adresse von referenz, das ist ein Zeiger. Auf der Seite des Aufrufers sieht ein Referenzparameter genauso aus wie ein Value-Parameter. Wie soll ich das denn hier anstellen:confused:Indem du dem Connect-Konstruktor einen CInternetSession&-Parameter verpasst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.