因为开发cad需要请求服务器的数据,再次之前我在服务器搭设了webapi用户传递数据,所以安装了libcurl在objectarx中使用数据。
Open VS2012 x64 Native Tools Command Prompt补充地址:
我在此将相关的引用配置图片,cad里面的应用和常规的一致。




所有的使用与现在的案例一致,但是我这里发生了一个错误,我在此记录一下,在下面这段代码当中,我运行程序,cad报错内存泄漏,定位问题之后发现问题出错在这句
1
| CURLcode res = curl_easy_perform(curl);
|
我查看了很多文章都无法解决,后来发现其实是此处的数据传递错误,我的指针传递错误导致的问题,
这里是问题代码片段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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; }
|
可以看到在这句代码中我传入了一个指针
1
| curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &webApi::curlWriteFunction);
|
问题出现这里是因为此处需要调用的是回调函数指针,但是我的代码中使用的是实例函数指针,导致传值错误,从而引发了后面的问题。
此处修改为:
1 2 3 4 5 6 7 8 9 10 11 12
| 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; }
|
之后修改原来的代码段:
1 2 3 4 5 6 7 8 9 10
| 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;
|
问题解决。