wulfgang Geschrieben 9. Februar 2009 Teilen Geschrieben 9. Februar 2009 Morgen, ich wollte auf main.h zugreifen- finde diese aber nicht.:confused: Wenn ich ein Projekt neu baue, habe ich als Headerdatei nur stdafx.h. Wo ist mein main.h denn geblieben? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 9. Februar 2009 Teilen Geschrieben 9. Februar 2009 main.h ist kein besonderer Header. Es ist weder ein Standardheader, noch einer, der von VC automatisch angelegt wird. Du kannst deine eigenen Header nennen, wie du willst, main.h nimmt da keine Sonderstellung ein. Ich weiß nicht, worauf du zugreifen wolltest, aber da steht nichts drin, was du nicht selbst hineinschreibst. Beschreib doch mal das Problem, nicht das, was du für die Lösung hältst Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 9. Februar 2009 Autor Teilen Geschrieben 9. Februar 2009 Ich schreibe einen FTP-Clienten. Mit GetFtpConnection bekomme ich meinen Zeiger auf ein CInternetSession Objekt. Nun habe ich verschiedene Klassen zum Löschen, Runterladen, Hochladen...Bisher muss ich dann für jede dieser Funktionen/Klassen eine neue Verbindung aufbauen. Mein Ziel ist es, dass ich die Verbindung nur einmal aufbauen muss. Jetzt kann ich ja in einer anderen Klasse sagen connection_pointer=Connect::getLastConnection(); Dann wird bloß jedes mal die Verbindung wieder aufgebaut. Connect.cpp CFtpConnection* Connect::connection_pointer=NULL; CInternetSession session((_T("My FTP Session")),1, INTERNET_OPEN_TYPE_PROXY , (_T( "proxy")), NULL, 0); Connect::Connect(void) { //Objekt session wird erzeugt //Zeiger auf CFtpConnection CFtpConnection *connection; //Objekt der Klasse read_serverlist wird erzeugt read_serverlist LeseListe;CFtpConnection * if(connection = session.GetFtpConnection(pstrServer, LeseListe.servername, LeseListe.password, port, bPassive)) { cout << "Verbindung wurde aufgebaut\n"; connection_pointer=connection; } } Connect::getLastConnection() { return connection_pointer; } Connect.h class Connect : public read_serverlist { public: Connect(void); static CFtpConnection * Connect::getLastConnection(); static CFtpConnection *connection_pointer; void give_connection(void); public: ~Connect(void); }; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 9. Februar 2009 Teilen Geschrieben 9. Februar 2009 Dann wird bloß jedes mal die Verbindung wieder aufgebaut.Woraus schließt du das? Der Aufruf von getLastConnection kann das nicht bewirken. Es wird eine neue Verbindung aufgebaut, wenn du ein Connect-Objekt erstellst. Das solltest du natürlich nur einmal tun. Und was hat das alles mit main.h zu tun? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 9. Februar 2009 Autor Teilen Geschrieben 9. Februar 2009 (bearbeitet) Woraus schließt du das? Ich habe in der Methode Connect eine Bildschirmausgabe mit eingebaut. Wenn ich nun transfer_textfile(); delete_textfile(); aufrufe erhalte ich zwei Bildschirmausgaben. Lag wohl daran dass transfer_textfile von Connect abgeleitet ist. delete_textfile.h class delete_textfile { public: delete_textfile(void); public: ~delete_textfile(void); }; delete_textfile.cpp delete_textfile::delete_textfile(void) { Connect(); CFtpConnection* connection_pointer; connection_pointer=Connect::getLastConnection(); //Objekt der Klasse read_serverlist wird erzeugt read_serverlist LeseListe; //Textdatei wird gelöscht BOOL bWorking = connection_pointer->Remove (LeseListe.source_txt); if (bWorking) { cout << "Datei ist gelöscht worden"; } else { cout << GetLastError(); } } in transfer_textfile.cpp transfer_textfile::transfer_textfile(void) { CFtpConnection* connection_pointer; read_serverlist LeseListe; connection_pointer=Connect::getLastConnection(); CFtpFileFind finder(connection_pointer); try { //Verzeichnis wird gewechselt if(connection_pointer->SetCurrentDirectory(_T("automatic/get_bu"))) { cout<<"Verzeichnis wurde mit Erfolg! gewechselt\n"; //Datei wird gesucht BOOL bWorking = finder.FindFile(_T("bu.txt")); if(bWorking) { //Datei wird vom Server auf lokale Festplatte transferriert BOOL bGot = connection_pointer->GetFile(_T("bu.txt"),LeseListe.destination_txt,FALSE); if (bGot) { cout << "Transfer sollte erfolgt sein\n"; } else { cout << GetLastError() << "\n"; } } else { cout << "The File specified could not be found.!"<<GetLastError(); } } else { DWORD dwInfo = 0; TCHAR puffer[250] = _T(""); DWORD dwSize = sizeof(puffer) / sizeof(TCHAR); if( !InternetGetLastResponseInfo(&dwInfo, puffer, &dwSize) ) { cout << GetLastError(); cout << "Aufruf InternetGetLastResponseInfo nicht erfolgreich"; else { wcout << puffer; cout << "Aufruf InternetGetLastResponseInfo erfolgreich"; } } } catch(CException* error) { TCHAR szCause[1024]; error->GetErrorMessage(szCause,1024); printf_s("ERROR! %S\n", szCause); error->Delete(); } } transfer_textfile.h class transfer_textfile : public Connect { public: transfer_textfile(void); public: ~transfer_textfile(void); }; Und was hat das alles mit main.h zu tun? Ich wollte in main.h eine Klasse Connect als Member erstellen, um dann darauf zugreifen zu können. Bearbeitet 9. Februar 2009 von wulfgang Problem vorerst geklärt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 9. Februar 2009 Teilen Geschrieben 9. Februar 2009 transfer_textfile.h class transfer_textfile : public Connect [/code]Dadurch, dass transfer_textfile von Connect erbt, wird jedesmal, wenn du ein transfer_textfile-Objekt erstellst, der Connect-Konstruktor aufgerufen, der dann eine neue Verbindung erstellt. Warum erbt transfer_textfile eigentlich von Connect? Public-Vererbung stellt eine "ist ein"-Beziehung dar. Ein "transfer_textfile" [i]ist ein[/i] "Connect"? Ich wollte in main.h eine Klasse Connect als Member erstellen, um dann darauf zugreifen zu können. Du musst gar nicht darauf zugreifen, du musst nur dafür sorgen, dass eine einzige Instanz erstellt wird. Der Zugriff geschieht über den statischen Zeiger, für den brauchst du keine Instanz der Klasse. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 9. Februar 2009 Autor Teilen Geschrieben 9. Februar 2009 Ein "transfer_textfile" ist ein "Connect"? Hat Beziehung wäre wohl besser. Habe die Vererbung bei transfer_textfile jetzt rausgenommen. int _tmain(int argc, _TCHAR* argv[]) { int warte; Connect(); transfer_textfile(); delete_textfile(); cin >> warte; return 0; } delete.cpp habe ich jetzt auch geändert: delete_textfile::delete_textfile(void) { CFtpConnection* connection_pointer; connection_pointer=Connect::getLastConnection(); //Objekt der Klasse read_serverlist wird erzeugt read_serverlist LeseListe; //Textdatei wird gelöscht BOOL bWorking = connection_pointer->Remove (LeseListe.source_txt); if (bWorking) { cout << "Datei ist gelöscht worden"; } else { cout << GetLastError(); DWORD dwInfo = 0; TCHAR puffer[250] = _T(""); DWORD dwSize = sizeof(puffer) / sizeof(TCHAR); if( !InternetGetLastResponseInfo(&dwInfo, puffer, &dwSize) ) { cout << GetLastError(); cout << "Aufruf InternetGetLastResponseInfo nicht erfolgreich"; } //Fehlerbehandlung falls InternetGetLastResponseInfo nicht aufgerufen werden konnte else { wcout << puffer; cout << "Aufruf InternetGetLastResponseInfo erfolgreich"; } } Das Problem: Wenn ich in delete_textfile den Konstruktor von Connect nicht ausführe bekomme ich die Meldung dass das File nicht gefunden wurde. Rufe ich aber erst delete_textfile(); und dann transfer_textfile(); aus funktioniert es. Ich bin noch nicht dahintergekommen wieso. 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.