Fehlermeldung: "Invalid allocation size"
-
Jetzt stehe ich schon vor dem nächsten Problem!
Also ich baue eine HTTP-Conn auf und generiere den Body.
Dann versende ich die Datei.
Das Problem ist, das GenerateRequestBody öfters im Programm aufgerufen wird.
Wenn man es nur einmal aufruft, dann klappt es ohne Probleme.std::string requestBody = GenerateRequestBody(lpszLocalFile, boundary);
Wenn ich allerdings ein 2tes mal Aufrufe sagt er mir Invalid allocation size!
std::string GenerateRequestBody(const std::string &filename, const std::string &boundary) { std::string requestBody; std::string field_name = "upload_file"; std::string contentDisposition = "Content-Disposition: form-data; name="" + field_name + ""; filename="" + filename + """; std::string contentType = "Content-Type: application/octet-stream"; requestBody.append("--" + boundary + "\r\n"); requestBody.append(contentDisposition + "\r\n"); requestBody.append(contentType + "\r\n"); requestBody.append("\r\n"); requestBody.append(GetFileContents(filename) + "\r\n"); // After the last file: requestBody.append("--" + boundary + "--\r\n"); return requestBody; }
String habe ich auch schon versucht zu entleeren mit.
requestBody.empty(); requestBody.erase(); requestBody.clear();
Hat aber leider nicht funktioniert.
Vielen Dank für eure Hilfe...
-
Der Fehler wird wohl woanders liegen.
-
Also die Fehlermeldung erscheint, wenn die Zeile ausgeführt wird.
requestBody.append(GetFileContents(filename) + "\r\n");
-
vielleicht ist der Fehler in GetFileContents? kannst du den code mal zeigen?
-
Merci schon einmal
std::string GetFileContents(const std::string &filename) { HANDLE hFile = CreateFile(filename.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); //assert(hFile != INVALID_HANDLE_VALUE); DWORD dwFileSize = GetFileSize(hFile, NULL); char *p = (char *)malloc(dwFileSize); DWORD dwBytesRead; ReadFile(hFile, p, dwFileSize, &dwBytesRead, NULL); std::string fileContents; fileContents.assign(p, dwFileSize); free(p); return fileContents; }
-
Na da haben wir den Fehler ja schon. Du schliesst das File nicht mit CloseHandle.
Kurt
-
Wie groß ist die Datei die du einliest?
-
Die Datei ist ca. 700 Zeilen kann aber auch noch größer werden ich sag mal 1000 Zeilen.
@Wie muss das denn aussehen?
DennInternetCloseHandle(hfileContents);
Funktioniert nicht ....
-
Ich meinte eigentlich die Dateigröße in Bytes. Na ja, aber wird wohl bestimmt nicht so groß sein.
Datei schließen geht mit CloseHandle, aber ich glaub nicht das es daran liegt.
-
Versuch einfach nur CloseHandle(hFile);
-
ALso 700 bis 1000 Bytes (meinte nicht Zeilen sondern Zeichen^^)
-
Ja habe schon alles mit CloseHandle ausprobiert...
AuchCloseHandle(hFile);
Daran kann es nicht liegen...
Der Aufruf funktioniert ja leider nur das erste mal ohne probleme
-
Die Fehlermaldung "Invalid allocation size" hat mit Sicherheit damit zu tun dass du GetFileSize mit einem umgültigen handle aufrufst denn dann gibt GetFileSize INVALID_FILE_SIZE zurück und das ist etwas zu gross für malloc.
Das CreateFile dir einen ungültigen handle zurückliefert kann viele Gründe haben. Einer Wäre dass das File noch immer offen ist ( da du es bein vorigen Aufruf ja nicht geschlossen hast ) oder auch dass das File nicht existiert. Deine funktion GetFileContents( .. ) braucht auf jeden Fall eine vernünftige Fehlerbehandlung. Warum du das assert auskommentiert hast ist mir schleierhaft damit hättest du den Fehler schon lange eingrenzen können.
BTW Files zu öffnen und sie danach nicht zu schliessen rächt sich früher oder später denn Windows hat nicht allzu viele filehandles zu vergeben.
Kurt
-
Assert habe ich auskommentiert, da kam folgende meldung:
"Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden"Trotz meinem
#include <assert.h>
Muss ich noch was includen??
Damit assert Funktioniert?
-
Es funktioniert
Danke für eure hilfe . . .
-
Habe hier VC6. Bei mir funktioniert assert auch wenn ich nur <assert.h> einbinde.
Kurt