Stringzusammensetzung funktioniert nicht wie gewollt (GET Request)



  • Hallo,

    ich bin aktuell dabei für meinen Server von einem Spiel (GTA SA:MP) einen Anti Cheat Client zu schreiben. Das meiste funktioniert auch. Ich habe allerdings aktuell ein Problem bei dem Zusammensetzen eines Strings bei einem GET Request.

    string getAccessKey(string username) {
    	HINTERNET hInternet = InternetOpenW(L"AC Launcher", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    	HINTERNET hConnect = InternetConnectW(hInternet, L"blub.domain.de", 80, NULL, NULL, INTERNET_SERVICE_HTTP, 0, NULL);
    	const wchar_t* parrAcceptTypes[] = { L"text/*", NULL };
    	HINTERNET hRequest = HttpOpenRequestW(hConnect, L"GET", "/xd.php?username=" + username + "&a=b", NULL, NULL, parrAcceptTypes, 0, 0);
    	BOOL bRequestSent = HttpSendRequestW(hRequest, NULL, 0, NULL, 0);
    
    	std::string strResponse;
    	const int nBuffSize = 1024;
    	char buff[nBuffSize];
    
    	BOOL bKeepReading = true;
    	DWORD dwBytesRead = -1;
    
    	while(bKeepReading && dwBytesRead!=0) {
    		bKeepReading = InternetReadFile( hRequest, buff, nBuffSize, &dwBytesRead );
            strResponse.append(buff, dwBytesRead);
        }
    
    	InternetCloseHandle(hRequest);
        InternetCloseHandle(hConnect);
        InternetCloseHandle(hInternet);
    
    	return strResponse;
    }
    

    Ziel davon ist es, dass er von der Website mir einen Accesskey zurückliefert. Wofür der gebraucht wird ist irrelevant. Es geht hauptsächlich um den String "/index.php?username=" + username + "&request=1", der mir Probleme bereitet.

    Folgende Fehler bekomme ich in der selben Zeile von "/index.php?username=" + username + "&request=1":

    Fehler	1	error C2664: 'HttpOpenRequestW': Konvertierung des Parameters 3 von 'std::basic_string<_Elem,_Traits,_Ax>' in 'LPCWSTR' nicht möglich	c:\users\manuel\documents\visual studio 2010\projects\cosa launcher (console)\main.cpp	34
    
    	3	IntelliSense: Es ist keine passende Konvertierungsfunktion von ""std::basic_string<char, std::char_traits<char>, std::allocator<char>>"" in ""LPCWSTR"" vorhanden.	c:\users\manuel\documents\visual studio 2010\projects\cosa launcher (console)\main.cpp	34
    

    Folgendes wird rot unterstrichen:

    "/index.php?username="
    

    Vielen Dank für Eure Hilfe.


  • Mod

    Wenn man zwei Strings per + aneinanderhängt, ist der Typ des resultierenden Ausdrucks std::string . Was du also möchtest ist diesen zusammengesetzten std::string in einen C-String, char const* , zu konvertieren. Das geht mittels der Memberfunktion c_str() (Seit C++11 gibt es dafür auch data() ):

    HINTERNET hRequest = HttpOpenRequestW(hConnect, L"GET", ("/xd.php?username=" + username + "&a=b").c_str(), NULL, NULL, parrAcceptTypes, 0, 0);
    

    (Es wäre sinnvoll diesen String in eine eigene Variable auszulagern, der Lesbarkeit halber.)



  • Hallo,

    vielen Dank für Deine Hilfe. Ich habe die Änderung vorgenommen und habe noch diese Fehler:

    Fehler	1	error C2664: 'HttpOpenRequestW': Konvertierung des Parameters 3 von 'const char *' in 'LPCWSTR' nicht möglich	c:\users\manuel\documents\visual studio 2010\projects\cosa launcher (console)\main.cpp	34
    
    Warnung	2	warning C4244: 'Argument': Konvertierung von 'std::streamoff' in 'unsigned int', möglicher Datenverlust	c:\users\manuel\documents\visual studio 2010\projects\cosa launcher (console)\main.cpp	63
    
    	3	IntelliSense: Das Argument vom Typ ""const char *"" ist mit dem Parameter vom Typ ""LPCWSTR"" inkompatibel.	c:\users\manuel\documents\visual studio 2010\projects\cosa launcher (console)\main.cpp	34
    

  • Mod

    Upsi, mein Fehler. LPCWSTR ist ja const wchar_t* , nicht const char* . Du willst also

    std::string str = "/xd.php?username=" + username + "&a=b";
    HINTERNET hRequest = HttpOpenRequestW(hConnect, L"GET", std::wstring(str.begin(), str.end()).c_str(), NULL, NULL, parrAcceptTypes, 0, 0);
    

    Hier wird der string zu einem wstring konvertiert, in dem jedes Zeichen einfach direkt zugewiesen wird (das dürfte hier reichen, da du ja nur ASCII verwendest).

    Edit: Die anderen Warnungen solltest du nicht ignorieren!


Log in to reply