您需要了解的是,CURL 是一个 C 库。通常,您不能将指针传递给 C++ 对象或函数,因为 C 对 C++ 的类和调用约定一无所知。
例如,这行不正确:
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
CURL setopt CURLOPT_ERRORBUFFER 期望第三个参数是指向 C 样式字符串(C 样式 char 数组)的指针,该字符串有空间用于 CURL_ERROR_SIZE 字符。相反,您将指针传递给 std::string 对象。由于用 C 编写的 CURL 不知道 std::string 是什么,它只是用错误数据覆盖具有 sizeof (std::string) 字节的字节表示,因为它认为指针指向 C 样式的 char 数组。
改用这个:
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 的调用包装在调用 C++ 函数的 extern "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。