Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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();

		}



}

Geschrieben

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"

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

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

Geschrieben

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?

Geschrieben

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)

Geschrieben

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();

    }



}

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

Geschrieben
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();

Geschrieben

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?

Geschrieben
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();

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

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

Geschrieben
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]

Geschrieben

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();

				}

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

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();

    }



}

Geschrieben
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.
Geschrieben
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?

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...