Что вам нужно понять, так это то, что CURL - это библиотека C. В общем, вы не можете передавать указатели на объекты или функции C ++, потому что C ничего не знает о классах C ++ и соглашении о вызовах.
Например, эта строка неверна:
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
CURL setopt CURLOPT_ERRORBUFFER
ожидает, что третий параметр является указателем на строку в стиле C (массив C-style char
), в которой есть место для символов CURL_ERROR_SIZE
. Вместо этого вы передаете указатель на объект std::string
. Поскольку CURL, написанный на C, не знает, что такое std::string
, он просто перезаписывает байтовое представление, имеющее sizeof (std::string)
байт, данными об ошибках, потому что считает, что указатель на массив char
в стиле C.
Используйте это вместо:
char errorBuffer[CURL_ERROR_SIZE + 1]; errorBuffer[CURL_ERROR_SIZE] = '\0';
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
errorBuffer
заполняется только допустимой строкой, если curl_easy_perform()
возвращает код ошибки.
Кроме того, Uploader::WriteResponce
- это функция C ++. С этой строкой:
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteResponce);
CURL ожидает, что третий параметр будет функцией указателя на C. Здесь вы передаете функцию указателя на C ++. Вам нужно заключить вызов в WriteResponce
в функцию extern "C"
, которая вызывает функцию C ++:
extern "C" size_t call_uploader_writeresponce(char *ptr, size_t size, size_t nmemb, void *user_data) {
return Uploader::WriteResponce(ptr, size, nmemb, static_cast<std::string *>(user_data));
}
// ...
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &call_uploader_writeresponce);
«Функция записи» должна возвращать size_t
, а не int
; Uploader::WriteResponce
нужно вернуть size_t
.