使用cURL的未处理异常(curl_easy_perform)

时间:2015-09-15 03:58:09

标签: exception visual-c++ curl

std::string DownloadFile(std::string Fname, std::string Furl)
{
            CURL *curl;
            CURLcode res;
            const char *url = Furl.c_str();
            curl = curl_easy_init();
            if (curl) {
                FILE * pFile;
                pFile = fopen(Fname.c_str(),"wb");
                if (pFile!=NULL) {
                    curl_easy_setopt(curl, CURLOPT_URL, url);
                    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);
                    curl_easy_setopt(curl, CURLOPT_WRITEDATA, pFile);
                    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE);
                    curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_func);
                    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
                    char errbuf[CURL_ERROR_SIZE];
                    curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf);
                    res = curl_easy_perform(curl);
                    std::string xres = curl_easy_strerror(res);
                    curl_easy_cleanup(curl);
                    fclose(pFile);
                    return xres;
                }
            }
}

我收到了这个错误:

  

“System.AccessViolationException”类型的未处理异常   发生在Fourth.exe附加信息:尝试阅读或   写保护的内存。这通常表明其他记忆   是腐败的。

就行:

res = curl_easy_perform(curl);

我出错的任何想法?

2 个答案:

答案 0 :(得分:0)

这很可能与您的一个卷曲选项有关,我会查看您添加的明显选项,例如CURLOPT_WRITEFUNCTIONCURLOPT_WRITEDATACURLOPT_ERRORBUFFER。我最初的评论是错误的:/

答案 1 :(得分:0)

我有类似的问题,我通过将回调设置为CURLOPT_WRITEFUNCTION来解决了这个问题,这是为您提供的示例:

namespace
{
    std::size_t callback(
            const char* in,
            std::size_t size,
            std::size_t num,
            char* out)
    {
        std::string data(in, (std::size_t) size * num);
        *((std::stringstream*) out) << data;
        return size * num;        
    }
}

然后像下面这样在您的CURLOPT_WRITEFUNCTION中使用它:curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);