因为开发cad需要请求服务器的数据,再次之前我在服务器搭设了webapi用户传递数据,所以安装了libcurl在objectarx中使用数据。
Open VS2012 x64 Native Tools Command Prompt补充地址:
我在此将相关的引用配置图片,cad里面的应用和常规的一致。
所有的使用与现在的案例一致,但是我这里发生了一个错误,我在此记录一下,在下面这段代码当中,我运行程序,cad报错内存泄漏,定位问题之后发现问题出错在这句
CURLcode res = curl_easy_perform(curl);
我查看了很多文章都无法解决,后来发现其实是此处的数据传递错误,我的指针传递错误导致的问题,
这里是问题代码片段
inline BOOL webApi::DownloadFile(const char* Filepath)
{// ...curl_easy_setopt(curl, CURLOPT_URL, combinePath.c_str());curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &webApi::curlWriteFunction);curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);CURLcode result = curl_easy_perform(curl);fclose(fp);curl_easy_cleanup(curl);curl_global_cleanup();return TRUE;
}
可以看到在这句代码中我传入了一个指针
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &webApi::curlWriteFunction);
问题出现这里是因为此处需要调用的是回调函数指针,但是我的代码中使用的是实例函数指针,导致传值错误,从而引发了后面的问题。
此处修改为:
webapi.h
static size_t downloadCallback(void *buffer, size_t sz, size_t nmemb, void *writer);webapi.cpp
size_t webApi::downloadCallback(void* buffer, size_t sz, size_t nmemb, void* writer)
{std::string* psResponse = (std::string*)writer;size_t size = sz * nmemb;psResponse->append((char*)buffer, size);return sz * nmemb;
}
之后修改原来的代码段:
std::string strTmpStr;
CURL *curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, downloadCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &strTmpStr);
CURLcode res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
std::string strRsp;
问题解决。