wulfgang Geschrieben 30. Januar 2009 Teilen Geschrieben 30. Januar 2009 Hallo, ich möchte mit SetCurrentDirectory in einen anderen Ordner gelangen. Erhalte aber durch GetLastError noch den Fehler 12003. An extended error was returned from the server. This is typically a string or buffer containing a verbose error message. Call InternetGetLastResponseInfo to retrieve the error text. Bei der Funktion InternetGetLastResponseInfo habe ich noch nicht rausgefunden, wie die genau funktioniert. Kann mir jemand ein Beispiel geben oder sieht jemand so meinen Fehler? { if(connection = session.GetFtpConnection(pstrServer, login, passwd, port, bPassive)) { cout << "Verbindung wurde aufgebaut\n"; //connection_pointer=connection; } } //Fehleroutine catch (CInternetException* pEx) { cout<<"FEHLER : "<<GetLastError()<<endl; TCHAR sz[1024]; pEx->GetErrorMessage(sz, 1024); printf_s("ERROR! %S\n", sz); pEx->Delete(); } if(connection->SetCurrentDirectory(_T("ordner\ordner\ordner"))) { cout<<"...mit Erfolg!\n"; } else { cout << "...ohne Erfolg\nVerbindung wird geschlossen!\n"; cout<<"FEHLER : "<<GetLastError()<<endl; connection->Close(); } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
VaNaTiC Geschrieben 30. Januar 2009 Teilen Geschrieben 30. Januar 2009 zur Fehlermeldung kann ich Dir nich viel sagen, aber: "ordner\ordner\ordner" schaut nicht aus wie ein korrekter Pfad entweder "ordner/ordner/ordner" oder "ordner\\ordner\\ordner" Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 30. Januar 2009 Teilen Geschrieben 30. Januar 2009 if(connection->SetCurrentDirectory(_T("ordner\ordner\ordner"))) Der Compiler sollte hier eine Warnung ausgeben. Die sollte man auch nicht so einfach ignorieren. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 30. Januar 2009 Autor Teilen Geschrieben 30. Januar 2009 if(connection->SetCurrentDirectory(_T("ordner\ordner\ordner")) ) Also der Compiler gibt mir keine Warnung aus. Wieso sollte er denn? Habe es auch probiert mit: if(connection->SetCurrentDirectory(_T("ordner/ordner/ordner")) ) if(connection->SetCurrentDirectory(_T("ordner\\ordner\\ordner")) )[/ Hat aber keinen Unterschied gemacht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 30. Januar 2009 Teilen Geschrieben 30. Januar 2009 Also der Compiler gibt mir keine Warnung aus. Wieso sollte er denn?Der Backslash leitet eine Escape-Sequenz ein. Um einen Backslash in einem Stringliteral unterzubringen, musst du zwei benutzten. Möglicherweise bekommst du keine Warnung, weil die "ordner" eigentlich mit einem Zeichen anfangen, das eine gültige Escape-Sequenz darstellt, z.B. n oder t. Habe es auch probiert mit: if(connection->SetCurrentDirectory(_T("ordner/ordner/ordner")) ) if(connection->SetCurrentDirectory(_T("ordner\\ordner\\ordner")) )[/ Hat aber keinen Unterschied gemacht. Na dann benutzt doch mal InternetGetLastResponseInfo, wie in der Fehlermeldung angegeben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 30. Januar 2009 Autor Teilen Geschrieben 30. Januar 2009 Also laut MSDN hat InternetGetLastResponseInfo ja drei Parameter, die alle Zeiger sind, richtig? Nur ist mir noch nicht ganz klat, welcher Parameter wofür. Bei mir funktioniert der Aufruf auch nur bei: DWORD *lpdwError; LPTSTR lpszBuffer; DWORD *lpdwBufferLength; InternetGetLastResponseInfo(lpdwError, lpszBuffer, lpdwBufferLength); Ist aber ja irgendwie noch falsch. Der zweite Parameter müsste auch ein Zeiger sein,oder? Wenn die Parameter Zeiger sind, wie komme ich denn dann an die ErrorMessage? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
peter_lustich_kanns Geschrieben 31. Januar 2009 Teilen Geschrieben 31. Januar 2009 also ich finde folgendes im msdn: BOOL InternetGetLastResponseInfo( __out LPDWORD lpdwError, __out LPTSTR lpszBuffer, __inout LPDWORD lpdwBufferLength ); und du hast recht, das sind Pointer zu einem Buffer, der die Informationen speichert. Wenn du im msdn weiter ließt, findest du golgendes zum Return Value: Returns TRUE if error text was successfully written to the buffer, or FALSE otherwise. To get extended error information, call GetLastError. If the buffer is too small to hold all the error text, GetLastError returns ERROR_INSUFFICIENT_BUFFER, and the lpdwBufferLength parameter contains the minimum buffer size required to return all the error text. Sprich benutze GetLastError und erhalte deine Information... InternetGetLastResponseInfo Function (Windows) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 3. Februar 2009 Autor Teilen Geschrieben 3. Februar 2009 Moin, also habe das mit InternetGetLastResponseInfo umgesetzt und erhalte Error 122 The data area passed to a system call is too small. Ich weiß nicht so genau was das nun heißt und wie das zu beheben ist. #include "StdAfx.h" #include "transfer_textfile.h" #include "windows.h" #include <iostream> #include "Connect.h" using namespace std; transfer_textfile::transfer_textfile(void) { Connect(); CFtpConnection* connection_pointer; connection_pointer=Connect::getLastConnection(); CFtpFileFind finder(connection_pointer); try { if(connection_pointer->SetCurrentDirectory(_T("Ordner\\ordner\\ordner"))) { cout<<"...mit Erfolg!\n"; BOOL bWorking = finder.FindFile(_T("file.txt")); if(bWorking) { BOOL bGot = connection_pointer->GetFile(_T("file.txt"),_T("C:\\Ordner\\TxtTransfer")); } else { //something wrong with the file.. inform the user cout << "The File specified could not be found.!"<<GetLastError(); } } else { cout<<"FEHLER : "<<GetLastError()<<endl; DWORD dwInfo; DWORD dwLength; char *pszResponse = NULL; InternetGetLastResponseInfo(&dwInfo, NULL, &dwLength); cout << GetLastError(); } } catch(CException* error) { TCHAR szCause[1024]; error->GetErrorMessage(szCause,1024); printf_s("ERROR! %S\n", szCause); error->Delete(); } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 3. Februar 2009 Teilen Geschrieben 3. Februar 2009 Moin, also habe das mit InternetGetLastResponseInfo umgesetzt Nicht wirklich. Der zweite Parameter muss ein Zeiger auf einen Puffer sein. Und der dritte muss auf eine Variable zeigen, die die Länge dieses Puffers, in TCHARs, enthält. Du übergibst aber NULL und einen Zeiger auf ein uninitialisiertes DWORD. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 3. Februar 2009 Autor Teilen Geschrieben 3. Februar 2009 Der zweite Parameter muss ein Zeiger auf einen Puffer sein. Und der dritte muss auf eine Variable zeigen, die die Länge dieses Puffers, in TCHARs, enthält. Du übergibst aber NULL und einen Zeiger auf ein uninitialisiertes DWORD. Funktioniert so aber noch nicht ganz. Wollte die Größe des Buffers eigentlich mit sizeof ermitteln. Aber sizeof gibt wohl einen falschen Datentyp zurück. error C2440: 'initializing' : cannot convert from 'size_t' to 'DWORD *' DWORD dwInfo; TCHAR puffer[50]; TCHAR *pszResponse = puffer; DWORD *dwLength= sizeof(puffer); InternetGetLastResponseInfo(&dwInfo, (LPTSTR)pszResponse , dwLength); cout << GetLastError(); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 3. Februar 2009 Teilen Geschrieben 3. Februar 2009 Warum hast du aus dwLength denn jetzt einen Zeiger gemacht? Und was soll der Cast auf LPTSTR da? Und sizeof liefert die Größe in Bytes, nicht in TCHARs. Das hatten wir doch auch schon einmal, oder? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 3. Februar 2009 Autor Teilen Geschrieben 3. Februar 2009 Warum hast du aus dwLength denn jetzt einen Zeiger gemacht? In der MSDN steht doch Pointer to a variable that contains the size of the lpszBuffer buffer, in TCHARs. Deswegen habe ich daraus einen Zeiger. Und was soll der Cast auf LPTSTR da? Habe ich weggenommen. Und sizeof liefert die Größe in Bytes, nicht in TCHARs. Das hatten wir doch auch schon einmal, oder? Soll das Ergebnis von sizeof dann wieder durch wchar_t geteilt werden? Dann erhalte ich logischerweise vom Compiler 'InternetGetLastResponseInfoW' : cannot convert parameter 3 from 'wchar_t *' to 'LPDWORD' 'initializing' : cannot convert from 'size_t' to 'wchar_t *' Ich habe doch durch (sizeof(wchar_t)) geteilt? DWORD dwInfo; wchar_t puffer[50]; wchar_t *pszResponse = puffer; wchar_t *dwLength = (sizeof(puffer))/(sizeof(wchar_t)); InternetGetLastResponseInfo(&dwInfo, pszResponse , dwLength); cout << GetLastError(); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 3. Februar 2009 Teilen Geschrieben 3. Februar 2009 In der MSDN steht doch Deswegen habe ich daraus einen Zeiger.Du hast aber keine Variable mehr, nur noch einen Zeiger. Wenn da steht "Zeiger auf eine Variable", dann legst du eine Variable an, und übergibst deren Adresse, wie es du es im ersten Code getan hast. Das Problem war doch nur, dass da kein definierter Wert drinstand. Soll das Ergebnis von sizeof dann wieder durch wchar_t geteilt werden? Dann erhalte ich logischerweise vom Compiler Das bekommst du, weil du (aus unerfindlichen Gründen) einen wchar_t-Zeiger draus gemacht hast. Einen eigenen Zeiger pszResponse brauchst du nicht, du kannst das Puffer-Array selbst benutzen. Und du sollst durch sizeof(TCHAR) teilen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 3. Februar 2009 Autor Teilen Geschrieben 3. Februar 2009 Einen eigenen Zeiger pszResponse brauchst du nicht, du kannst das Puffer-Array selbst benutzen. War das so gemeint? DWORD dwInfo; TCHAR puffer[50]; TCHAR *pszResponse = puffer; InternetGetLastResponseInfo(&dwInfo, (LPTSTR)pszResponse , (sizeof(puffer)/sizeof(TCHAR))); cout << GetLastError(); Als 3.Parameter brauche ich in dieser Funktion doch den Datentyp LPDWORD. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 3. Februar 2009 Teilen Geschrieben 3. Februar 2009 War das so gemeint?Nein, weil du immer noch pszResponse ebnutzt. Als 3.Parameter brauche ich in dieser Funktion doch den Datentyp LPDWORD.Schau nicht nur auf den Typ, schau auf die Beschreibung des Parameters. Ja, du brauchst da einen DWORD-Zeiger. Aber nicht irgendeinen. Du brauchst einen Zeiger auf ein DWORD, in dem drinsteht, wie groß der Puffer ist. Ich verstehe nicht, wo hier das Problem ist. Bei dwInfo hast du das doch auch hinbekommen. DWORD dwInfo = 0; TCHAR puffer[50] = _T(""); DWORD dwSize = sizeof(puffer) / sizeof(TCHAR); if( !InternetGetLastResponseInfo(&dwInfo, puffer, &dwSize) ) { // GetLastError [/code] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 3. Februar 2009 Autor Teilen Geschrieben 3. Februar 2009 Moin, war dein ! Absicht? Ich erhalte jetzt Error 122 The data area passed to a system call is too small. DWORD dwInfo = 0; TCHAR puffer[50] = _T(""); DWORD dwSize = sizeof(puffer) / sizeof(TCHAR); if( InternetGetLastResponseInfo(&dwInfo, puffer, &dwSize) ) { cout << GetLastError(); } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 3. Februar 2009 Teilen Geschrieben 3. Februar 2009 Moin, war dein ! Absicht?Ja. Du sollst GetLastError ja nur aufrufen, wenn InternetGetLastResponseInfo fehlschlägt. Wenn es klappt, wäre es von Vorteil, wenn du dwInfo und puffer ausgibst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 3. Februar 2009 Autor Teilen Geschrieben 3. Februar 2009 Also habe mir jetzt puffer ausgeben lassen: 550 Prohibited file name Onlino Irgendwo\automat Die Fehler 550 habe ich nirgendswo gefunden. Der Pfadname ist auch abgeschnitten. Der vollständige Pfad lautet Onlino Irgendwo\\automatic\\uuu Was ist daran verboten? transfer_textfile::transfer_textfile(void) { Connect(); CFtpConnection* connection_pointer; connection_pointer=Connect::getLastConnection(); CFtpFileFind finder(connection_pointer); try { if(connection_pointer->SetCurrentDirectory(_T("Onlino Irgendwo\\automatic\\uuu"))) { cout<<"...mit Erfolg!\n"; BOOL bWorking = finder.FindFile(_T("file.txt")); if(bWorking) { BOOL bGot = connection_pointer->GetFile(_T("file.txt"),_T("C:\\CPlusPlus\\TxtTransfer")); } else { //something wrong with the file.. inform the user cout << "The File specified could not be found.!"<<GetLastError(); } } else { DWORD dwInfo = 0; TCHAR puffer[50] = _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(); } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 3. Februar 2009 Teilen Geschrieben 3. Februar 2009 Die Fehler 550 habe ich nirgendswo gefunden.In der FTP-Spezifikation hast du demnach nicht gesucht. Und Google spuckt für "550 Prohibited file name" auch hunderte Treffer aus. 550 Requested action not taken. File unavailable (e.g., file not found, no access). Quelle: RFC 959 (rfc959) - File Transfer Protocol Ich würde sagen, entweder gibt's das Verzeichnis nicht, oder du hast keine Rechte. Der Pfadname ist auch abgeschnitten.Das wiederum dürfte daran liegen, dass dein Puffer nur 50 Zeichen groß ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 3. Februar 2009 Autor Teilen Geschrieben 3. Februar 2009 Ich würde sagen, entweder gibt's das Verzeichnis nicht, oder du hast keine Rechte. Ist das die einzige Fehlerquelle oder gibt es noch irgendeine andere potentielle Möglichkeit? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 3. Februar 2009 Teilen Geschrieben 3. Februar 2009 Benutz mal Slashes statt Backslashes (natürlich nur einzelne). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
wulfgang Geschrieben 4. Februar 2009 Autor Teilen Geschrieben 4. Februar 2009 Jo, danke mit einzelen Slashes funktioniert es. 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.