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;

问题解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/159013.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux中的进程等待(超详细)

Linux中的进程等待 1. 进程等待必要性2. 进程等待的方法2.1 wait方法2.2 waitpid方法 3. 获取子进程status4. 具体代码实现 1. 进程等待必要性 我们知道,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内…

UE的PlayerController方法Convert Mouse Location To World Space

先上图: Convert Mouse Location To World这是PlayerController对象中很重要的方法。 需要说明的是两个输出值。 第一个是World Location,这是个基于世界空间的位置值,一开始我以为这个值和当前摄像机的位置是重叠的,但是打印出来…

kaggle项目部署

目录 流程详细步骤注意事项 流程 修改模块地址打包项目上传到kaggle Datasets创建code文件,导入数据与项目粘贴train.py文件,调整超参数,选择GPUsave version,后台训练查看训练结果 详细步骤 打开kaggle网站,点击da…

号卡分销管理系统搭建

随着移动互联网的发展,各种手机应用层出不穷,其中包括了很多用于企业管理的软件。号卡系统分销管理软件就是其中的一种。它是一种基于移动互联网的企业管理软件,能够帮助企业进行号卡的分销管理,从而提高企业的效率和竞争力。 …

抖音快手判断性别、年龄自动关注脚本,按键精灵开源代码!

这个是支持抖音和快手两个平台的,可以进入对方主页然后判断对方年龄和性别,符合条件的关注,不符合条件的跳过下一个ID,所以比较精准,当然你可以二次开发加入更多的平台,小红书之类的,仅供学习&a…

Linux(3):Linux 的文件权限与目录配置

把具有相同的账户放入到一个组里面,这个组就是这两个账户的 群组 。在访问资源(操作系统中计算机的资源)时,可以让这个组里面的所有用户都具有访问权限。 每个账号都可以有多个群组的支持。 在我们Liux 系统当中,默认的…

kibana8.10.4简单使用

1.创建discovery里的日志项目 点击stack management 选择kibana里的数据视图,右上角创建数据视图,输入名称。索引范围。例子 example-* ,匹配以example-开头的所有index。 然后点击 保存数据视图到kibana, 2.Kibana多用户创建及角色权限控…

macOS下如何使用Flask进行开发

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是全栈工…

力扣栈与队列--总结篇

前言 八道题,没想到用了五天。当然需要时间的沉淀,但是一天不能啥也不干啊! 内容 首先得熟悉特点和基本操作。 栈与队列在计算机底层中非常重要,这就是为什么要学好数据结构。 可视化的软件例如APP、网站之类的,都…

Word中NoteExpress不显示的问题

首先确认我们以及安装了word插件 我们打开word却没有。此时我们打开:文件->选项->加载项 我们发现被禁用了 选择【禁用项目】(如果没有,试一试【缓慢且禁用的加载项】),点击转到 选择启用 如果没有禁用且没有出…

工具推荐-卸载小助手GeekUninstaller

一.简介 1.1 GeekUninstalers是一款高效、快速、小巧、免费的软件卸载与清理工具,旨在帮助用户删除系统上安装的程序。 1.2 不同于其他的卸载程序,GeekUninstaller执行深入扫描进程,并清除软件卸载后留下的垃圾。 1.3 它是一款绿色软件&…

有关编译器的科普

Clang和GCC的主要区别如下所示: Clang比GCC编译用的时间更短,包括预处理、语法分析、解析、语义分析、抽象语法树生成的时间。Clang比GCC的内存占用更小。Clang生成的中间产物比GCC更小。Clang的错误提示比GCC更加友好。Clang有静态分析,GCC…

合璧之光,共创辉煌|明道云伙伴大会2023圆满结束

2023年11月3日至11月4日,“合璧之光明道云伙伴大会2023”在上海星河湾酒店顺利举行,报名参会人数超过1800人。大会邀请到明道云标杆客户及合作伙伴分享组织落地零代码的经验及各行业领域解决方案,包括越秀集团、豫园股份、远大医药&#xff0…

Springboot+vue的应急物资管理系统(有报告),Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的应急物资管理系统(有报告),Javaee项目,springboot vue前后端分离项目 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。…

极光笔记 | EngageLab Push的多数据中心接入指南

01背景 作为一个面向全球的消息推送服务平台,我们一直致力于给全球用户提供安全、可靠、高效的消息推送服务,因此我们意识到在不同洲建立数据中心的重要性。这样做将有助于提高我们的服务可用性、降低延迟并保护用户数据的安全性。 第一,通过…

redis数据结构

1 string(字符串)->opsForValue 介绍 一个 string 类型的键最大可以存储 512 MB 的数据 应用场景 1 缓存数据,提高访问速度和降低数据库压力。 2 计数器,利用 incr 和 decr 命令实现原子性的加减操作。 3 分布式锁&#xff0c…

Oracle 存储过程数据插入临时表慢以及SQL语句查询慢

/*parallel*/ 解释: 一般表数据量比较大(超过100万)时,可以使用parallel强制启动并行度来提升查询速度 用法:/*parallel(table_short_name,cash_number)*/ 可以加到insert、delete、update、select的后面来使用 比如&#xff…

数字逻辑电路基础-组合逻辑电路之复用器

文章目录 一、复用器简介二、verilog源码三、综合及仿真结果一、复用器简介 本文介绍数字逻辑电路中一种常用的基础组合逻辑电路-两选一复用器,顾名思义,它的功能就是通过一个控制信号来选择两个输入中之一作为输出。 它的逻辑表达式为:out = ~sa + sb 它的逻辑真值表为:…

解析CAD图纸出现乱码的原因及解决方法

解析CAD图纸出现乱码的原因及解决方法 CAD(计算机辅助设计)是现代工程设计中不可或缺的工具,它能够帮助工程师们高效地完成复杂的设计任务。然而,有时在使用CAD软件过程中,可能会遇到图纸出现乱码的问题,影…

centos7安装keepalived 保证Nginx的高可用

keepalived工作在虚拟路由器冗余协议 VRRP (Virtual Router Redundancy Protocol) 上,它允许一个静态 IP 在两个 Linux 系统之间进行故障转移。 环境准备: 两台虚拟机centos7,IP:192.168.213.4(backup) 192.168.213.6(master) 安…