Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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 :(

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.

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.

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?

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.

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?

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).

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 von wulfgang

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.

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?

Aber dann muss ich das Programm ja komplett umstricken.:(

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.

Kann ich ein Objekt als Referenz übergeben, oder muss ich das mit Zeigern?

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;

    }



}

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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.