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.
-
Wenn man zwei Strings per + aneinanderhängt, ist der Typ des resultierenden Ausdrucks
std::string
. Was du also möchtest ist diesen zusammengesetztenstd::string
in einen C-String,char const*
, zu konvertieren. Das geht mittels der Memberfunktionc_str()
(Seit C++11 gibt es dafür auchdata()
):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
-
Upsi, mein Fehler.
LPCWSTR
ist jaconst wchar_t*
, nichtconst char*
. Du willst alsostd::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 einemwstring
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!