Objectarx 使用libcurl请求WebApi

因为开发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;

问题解决。

猜你喜欢

转载自blog.csdn.net/qq_41059339/article/details/134467458