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

Hallo,

funktioniert leider immer noch nicht.:( Bekomme immer noch die gleiche Fehlermeldung.

Der von mir verwendete Proxy hat auch noch ein Passwort und einen Benutzer. Wo soll ich die denn eintragen?

  • Antworten 65
  • Ansichten 6.9k
  • Erstellt
  • Letzte Antwort

Top-Poster in diesem Thema

Hallo,

also ich habe dort INTERNET_OPTION_PROXY_PASSWORD und INTERNET_OPTION_PROXY_USERNAME gefunden.

Da ist leider kein Beispiel.

Ich würde das irgendwie so machen:

SetOption->session( INTERNET_OPTION_PROXY_PASSWORD::"meinPasswort" INTERNET_OPTION_PROXY_USERNAME::"meinUser", DWORD dwValue,

   DWORD dwFlags = 0 

);

Was muss noch verbessern? Mit der Beschreibung zum dwValue kann ich noch nicht so viel anfangen.

Ja eigentlich schon. Bei einer Funktionsdeklaration werden die Parameter und Datentypen festgelegt. Bei einem Funktionsaufruf werden Parameter übergeben. Ist doch so richtig?

Jetzt müsste das einem Funktionsaufruf näher kommen.

SetOption->session( INTERNET_OPTION_PROXY_PASSWORD::"meinPasswort" INTERNET_OPTION_PROXY_USERNAME::"meinUser", dwValue,

 dwFlags = 0 

);

Bearbeitet von wulfgang

Hey,

kann mir jemand Bitte noch mal helfen? In der der Hilfe steht echt nichts womit ich viel anfangen könnte. Ich weiß nicht wie ich die Flags eintragen soll und auch nicht was für dwValue und dwFlags = 0 stehen soll.

Wäre wirklich über jede Hilfe dankbar.:rolleyes:

Guten Morgen,

habe noch mal gesucht und probiert. Das ist herrausgekommen:

 session.SetOption(INTERNET_OPTION_PROXY_PASSWORD ,(DWORD)"meinpasswort");

	 session.SetOption(INTERNET_OPTION_PROXY_USERNAME ,(DWORD)"meinuser");
Der Compiler meckert nicht mehr. Bei Ausführung des Programms erhalte ich aber immer noch die Fehlermeldung:"Der Servername oder die Serveradresse konnten nicht verarbeitet werden." Ich erhalte noch die Warnung: "warning C4002: too many actual parameters for macro '_T' " Diese Warnung betrifft die Zeile:
CInternetSession session(_T("My FTP Session",1, INTERNET_OPEN_TYPE_PROXY , "beispielproxy-ge", NULL, 0));

Kann diese Zeile Ursache für mein Problem sein?

Grüße

Der Compiler meckert nicht mehr.

Ja, weil du es ihm quasi verboten hast. Der Cast auf DWORD sagt dem Compiler, dass er das so akzeptieren muss. Ich gehe ganz stark davon aus, dass du für String-Options die andere Version von SetOption benutzen musst.

Als allererste Maßnahme wäre es gut, den Rückgabewert von SetOption zu prüfen.

Hallo,

okay der Rückgabewert 0 von SetOption sagt mir, dass die Operation fehlgeschlagen ist.

Welche andere SetOption? In der Hilfe stehen ja zwei überladende. Ich weiß aber nicht wie ich die andere SetOption schreibe.

Moin,

also ich habe jetzt geschrieben:

 bool    abc = false;

	 abc = session.SetOption(

    INTERNET_OPTION_PROXY_PASSWORD,

    _T("jutta41"),

    _tcslen(_T("jutta41")) );

	cout << abc << "\n";



	session.SetOption(

    INTERNET_OPTION_PROXY_USERNAME ,

    _T("TSK957"),

    _tcslen(_T("TSK957")) );

Leider bekomme ich als Rückgabe weiterhin eine 0.

Außerdem bekomme ich folgende Warnungen:warning C4267: 'argument' : conversion from 'size_t' to 'DWORD', possible loss of data

und

warning C4800: 'BOOL' : forcing value to bool 'true' or 'false' (performance warning)

Hast du noch eine Idee?

GetLastError sagt:Fehler 12018

In der Documentation steht:

ERROR_INTERNET_INCORRECT_HANDLE_TYPE

12018

The type of handle supplied is incorrect for this operation

Dann stimmt da was mit den Datentypen wohl noch nicht?

Also ich versuche jetzt erst mal eine normale Ftp-Verbindung herzustellen-ohne Proxy. Damit ich das erst mal hinbekomme.

Ich erhalte trotzdem noch die Meldung das der Servername nicht verarbeitet werden kann. Liegt das irgendwie vielleicht an dem Casting:

pstrServer = (LPCTSTR)servername;

	LPCTSTR login = (LPCTSTR)"user";

    LPCTSTR passwd = (LPCTSTR)"password";
Außerdem erhalte ich noch eine Warnung: warning C4002: too many actual parameters for macro '_T' Mein Code jetzt:
// KlassenMethodenKonsole.cpp : Defines the entry point for the console application.

//


#include "stdafx.h"

#include <iostream>



	/////////////////////////////////////////////////////////

    //Block zum Aufbauen der Verbindung

	/////////////////////////////////////////////////////////



	//Bibliotheken für FTP-Session

	#include <afx.h>

	#include <afxwin.h>

	#include <afxinet.h>

	#include <stdio.h>



	int warte; 


	using namespace std;


	int _tmain(int argc, _TCHAR* argv[])

	{

		if (!AfxWinInit(::GetModuleHandle(NULL), NULL, 

                    ::GetCommandLine(), 0))

    {


        return -1;

    }


	//Objekt session wird erzeugt


	 CInternetSession session(_T("My FTP Session",1, INTERNET_OPEN_TYPE_DIRECT));  


//Zeiger auf CFtpConnection

	CFtpConnection *connection;




	//Deklarationen für GetFtpConnection Member-Funktion

	char servername[100]="beispielserver"; 

	LPCTSTR pstrServer;

	pstrServer = (LPCTSTR)servername;

	LPCTSTR login = (LPCTSTR)"user";

             LPCTSTR passwd = (LPCTSTR)"password";

             INTERNET_PORT port = 21;

             BOOL bPassive = FALSE;



	cout << "Verbinde mit " << servername << " ...\n";


	try

	{


	//FTP-Verbindung wird eröffnet,Methode GetFtpConnection wird auf session angewandt, connection wird auf zurückgegeben Zeiger gesetzt

		if(connection = session.GetFtpConnection(pstrServer, login, passwd, port, bPassive)) 

			{

			cout << "Verbindung wurde aufgebaut";     

			}


	}

	catch (CInternetException* pEx)

    {

		cout<<"FEHLER : "<<GetLastError()<<endl;

        TCHAR sz[1024];

        pEx->GetErrorMessage(sz, 1024);

        printf_s("ERROR!  %S\n", sz);

        pEx->Delete();

     }

	cin >> warte;

	return 0;

}

Morgen,

kann mir bitte noch jemand helfen wegen dem Servernamen? Ist mein Casting zu (LPCTSTR) irgendwie falsch? Wie umgehe ich das denn?

kann mir bitte noch jemand helfen wegen dem Servernamen?
Bitte kein Threadpushing, siehe Boardregeln.

Ist mein Casting zu (LPCTSTR) irgendwie falsch?
Ein Cast bedeutet, dass hier der Programmierer besser weiß, was richtig ist, als der Compiler. Deswegen sollte man Casts auch nur einsetzen, wenn man weiß, was man tut. Keinesfalls sollte man versuchen, mit Cast Compilezeitfehler zu beheben. Das hat nur den Effekt, dass der Compiler dann zwar nicht mehr meckert, man sich dafür aber Laufzeitfehler einhandelt.

Was soll dieser Cast denn bewirken?

Moin,

laut msdn ist das Casting doch notwendig? Dort wird doch als Datentyp für CInternetSession::GetFtpConnection LPCTSTR vorgegeben. Und dann habe ich halt gecastet:). Wenn ich nicht caste bekomme ich

error C2440: '=' : cannot convert from 'char [100]' to 'LPCTSTR'.
als Fehlermeldung. Deswegen muss ich doch casten, oder nicht?
laut msdn ist das Casting doch notwendig? Dort wird doch als Datentyp für CInternetSession::GetFtpConnection LPCTSTR vorgegeben. Und dann habe ich halt gecastet:).
Und genau das ist falsch. Casten bewirkt keine magische Typumwandlung. Casten ist rohe Gewalt.

Wenn ich nicht caste bekomme ich als Fehlermeldung. Deswegen muss ich doch casten, oder nicht?
Nein, das habe ich doch im letzten Beitrag erklärt. Mit dem Cast erreichst du nur, dass der Compiler den Mund hält. Der Code bleibt so falsch, wie er war.

Casts braucht man nur sehr selten. Leider gewöhnen sich Anfänger oft an, Compilefehler wegen unpassender Typen durch Casts zu "beheben". Gewöhn dir diesen Reflex "Typfehler -> Casten" bitte ganz schnell wieder ab.

Dein Zeichenkettenliteral ist ein Array von const char. Du brauchst LPCTSTR, das ist ein Zeiger auf const TCHAR. TCHAR ist, abhängig davon, ob du Unicode benutzt oder nicht, entweder char oder wchar_t bzw. WCHAR. In deinem Fall ist Unicode definiert, sonst würde der Compiler keine Fehler ausgeben, wenn du den Code weglässt.

Benutzt das _T-Makro für deine Stringliterale.

Guten Morgen,

also ich habe es jetzt ohne Proxy hinbekommen! Danke für die Hilfe:uli

Mit Proxy kriege ich das leider noch nicht hin.

Irgendwas stimmt noch nicht mit meinem: session.SetOption h. Der Rückgabewert ist 0 und getLastError sagt

ERROR_INTERNET_INCORRECT_HANDLE_TYPE

12018 The type of handle supplied is incorrect for this operation.

bool    abc = false;

	 abc = session.SetOption(

    INTERNET_OPTION_PROXY_PASSWORD,

    _T("meinpassword1"),

    _tcslen(_T("meinpassword1")) );

	cout << abc << "\n";

	cout<<"FEHLER : "<<GetLastError()<<endl;

Habe das ja genauso umgesetzt wie hier im Forum geschrieben. Sieht noch jemand meinen Fehler? Ist das _tcslen dazu da die Länge vom Buffer zu bestimmen?

meinpassword1 muss ja vom Typ lpvoid sein, ist das _T vielleicht falsch?

Grüße

Ich habe ein wenig gesucht und dabei mehrere Hinweise auf dasselbe Problem, aber keine definitive Lösung gefunden. Es scheint, als ob du die Proxy-Options über das Connect-Handle setzen musst, nicht über das Session-Handle.

Siehe:

Setting and Retrieving Internet Options (Windows)

Leider habe ich den MFC-Code hier gerade nicht zur Hand, daher kann ich nicht nachsehen, wie das genau in CInternetSession gekapselt ist.

Ich könnte mir aber vorstellen, dass das mit MFC möglicherweise gar nicht geht, du also die "rohe" WinAPI benutzen musst.

I

Ich könnte mir aber vorstellen, dass das mit MFC möglicherweise gar nicht geht, du also die "rohe" WinAPI benutzen musst.

Na gut oder auch nicht. Dann versuche ich das erst mal mit einem offenen Proxy. Allerdings bekomme ich da immer noch die Meldung, dass der Servername oder die Serveradresse nicht verarbeitet werden konnten. Kann das am Makro _T bei

LPCTSTR pstrServer = _T("ftp://beispiel.org");
liegen? Dass das Makro falsch umwandelt?
int _tmain(int argc, _TCHAR* argv[])

	{

		if (!AfxWinInit(::GetModuleHandle(NULL), NULL, 

                    ::GetCommandLine(), 0))

    {


        return -1;

    }


	//Objekt session wird erzeugt


	 CInternetSession session(_T("My FTP Session",1, INTERNET_OPEN_TYPE_PROXY , "beispielproxy", NULL, 0));  

CFtpConnection *connection;




	//Deklarationen für GetFtpConnection Member-Funktion

	char servername[100]="ftp://beispiel.org"; 


	LPCTSTR pstrServer = _T("ftp://beispiel.org");

	LPCTSTR login = _T("user");

    LPCTSTR passwd = _T("password"); 

    INTERNET_PORT port = 21;

    BOOL bPassive = FALSE;



	cout << "Verbinde mit " << servername << " ...\n";


	try

	{


	//FTP-Verbindung wird eröffnet,Methode GetFtpConnection wird auf session angewandt, connection wird auf zurückgegeben Zeiger gesetzt

		if(connection = session.GetFtpConnection(pstrServer, login, passwd, port, bPassive)) 

			{

			cout << "Verbindung wurde aufgebaut";     

			}


	}

	catch (CInternetException* pEx)

    {

		cout<<"FEHLER : "<<GetLastError()<<endl;

        TCHAR sz[1024];

        pEx->GetErrorMessage(sz, 1024);

        printf_s("ERROR!  %S\n", sz);

        pEx->Delete();

Kann das am Makro _T bei

LPCTSTR pstrServer = _T("ftp://beispiel.org");

liegen?

Dass das Makro falsch umwandelt?

Nein, das Makro macht in deinem Fall nur ein L vor das Stringliteral, nichts weiter.

Allerdings hat das "ftp://" da nichts verloren. Da soll nur der Servername rein, kein URL.

Moin, also wenn da auch nicht der Fehler ist, wo ist der dann.....

Kann diese Zeile Ursache für mein Problem sein?

CInternetSession session(_T("My FTP Session",1, INTERNET_OPEN_TYPE_PROXY , "beispiel.man.de.eu.beispiel.Corp:21", NULL, 0));

Ich erhalte für das Makro _T die Warnung das ich zu viele Parameter hätte.

Für jeden Parameter einzeln anwenden kann ich das Makro ja auch nicht.

Ich erhalte für das Makro _T die Warnung das ich zu viele Parameter hätte.

Für jeden Parameter einzeln anwenden kann ich das Makro ja auch nicht.

Du sollst es auch nur dort anwenden, wo es nötig ist, also dort, wo ein LPCTSTR gefragt ist, du aber nur ein char-Literal hast.

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.