c++ stub函数打桩

应用场景:
当我们在开发一个涉及到第三方sdk库的软件时,比如做一个上位机控制客户端,该客户端当中调用了一份sdk库当中的接口。而这份sdk库,作为上层客户端软件与下层设备进行通信的媒介,可能需要在有真实设备的环境下,才可以进行消息的收发。
这样如果就没有环境的时候运行我们的客户端,可能在调用到sdk接口函数的地方,就出错导致程序无法正常运行。
而我们可能只是希望运行某个跟设备没有交互的功能,不需要真实环境。
那这时我们就可以使用函数打桩,将这些sdk接口函数,使用我们自己临时定义的函数进行代替,让程序走到接口函数的时候,不执行原本的内容,使得程序也能走下去。


相关资源:
函数打桩需要使用到cpp-stub模块,相关文件链接:https://download.csdn.net/download/bangtanhui/89123831
创建工程后,引入cpp-stub/src文件夹下的stub.h头文件。


举例如下:
比如在程序执行到某一步调用sdk接口时,有这么一个接口:

typedef void* BOARDHANDLE;
typedef struct stBoxVersion{
	char sVersion[LEN_256]  = { 0 };
	int  nNetSpeed          =   0;
}stBoxVersion;

ZVITBOARDDLL int ZVITBOARD_CC
		ZVITGetBoxVersion(IN BOARDHANDLE hBoard, stBoxVersion* stBoxInfo);

该接口是用来获取设备版本信息的,函数名为ZVITGetBoxVersion,参数类型分别为BOARDHANDLE和stBoxVersion*,传的是设备句柄和设备信息结构体指针,返回值类型为int,用来判断是否成功。

在这里插入图片描述


而我们在没有真实设备环境下,调用这个接口是会出错的,这时就可以提前对该接口进行打桩。打桩简单来说,就是自己定义一个参数类型以及返回值类型,和原接口函数相同的函数,用来代替,内部我们自行实现。使得函数运行到原接口函数的位置时,实际走的是我们定义的接口。


参考代码:

#include "stub.h"

//原接口函数声明,定义不作展示
ZVITBOARDDLL int ZVITBOARD_CC ZVITGetBoxVersion(IN BOARDHANDLE hBoard, stBoxVersion* stBoxInfo);

//实现我们自定义的打桩函数
int sae_stub_get_version(BOARDHANDLE hBoard, stBoxVersion* stBoxInfo)
{
    Q_UNUSED(hBoard);
    
    memcpy(stBoxInfo->sVersion, std::string("arm_20240412_R").c_str(), std::string("arm_20240412_R").size());
    stBoxInfo->nNetSpeed = 100;
    
    return ZVIT_RTN_OK;
}



int main(){

	//初始化stub指针
	Stub * stub = new Stub;
	//对接口函数进行打桩
	stub->set(ZVITGetBoxVersion, sae_stub_get_version);

	
	stBoxVersion stBoxVer;
	//由于我们进行了打桩,这里实际调用的是sae_stub_get_version函数
    if(ZVIT_RTN_OK != ZVITGetBoxVersion(handle, &stBoxVer)){
        LOG(ERROR) << "从SDK接口获取设备版本信息错误";
        return -1;
    }

	return 0;
}

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

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

相关文章

社交网络与Web3:数字社交的演进

在数字化时代的浪潮下&#xff0c;社交网络已成为人们日常生活的重要组成部分。从早期的在线论坛到如今的社交媒体平台&#xff0c;社交网络已经成为人们交流、分享和获取信息的主要渠道。然而&#xff0c;随着区块链技术的发展&#xff0c;传统的社交网络正经历着一场革命性的…

Sy7 shell编程-1

实验环境&#xff1a; 宿主机为win11&#xff0c;网络&#xff1a;10.255.50.5 6389 WSL2 ubuntu 目标机的OS&#xff1a;Ubuntu 内核、版本如下&#xff1a; linuxpeggy0223:/$ uname -r 5.15.146.1-microsoft-standard-WSL2 linuxpeggy0223:/$ cat /proc/version Linux vers…

Java | Leetcode Java题解之第22题括号生成

题目&#xff1a; 题解&#xff1a; class Solution {static List<String> res new ArrayList<String>(); //记录答案 public List<String> generateParenthesis(int n) {res.clear();dfs(n, 0, 0, "");return res;}public void dfs(int n ,int…

动态规划应用

介绍 是用来解决一类最优问题的算法思想&#xff0c;将一个复杂的问题分解成若干个子问题&#xff0c;通过综合子问题的最优解得到。 递归写法实例 优化斐波那契数列 int F(int n){if(n0||n1) return 1;else{return F(n-1)F(n-2);}有太多重复计算&#xff0c;可用一个数组记…

oracle数据库怎么查看当前登录的用户?

方法如下&#xff1a; 输入select * from dba_users; 即可。 常用语句&#xff1a; 一&#xff0c;查看数据库里面所有用户&#xff1a; select * from dba_users; 前提是你是有dba权限的帐号&#xff0c;如sys,system。 二&#xff0c;查看你能管理的所有用户&#xff1…

.[[backup@waifu.club]].svh勒索病毒数据怎么处理|数据解密恢复

尊敬的读者&#xff1a; 近年来&#xff0c;随着信息技术的迅猛发展&#xff0c;网络安全问题日益凸显&#xff0c;其中勒索病毒成为了一大威胁。.[[backupwaifu.club]].svh、.[[MyFilewaifu.club]].svh勒索病毒就是其中之一&#xff0c;它以其独特的传播方式和恶劣的加密手段…

Spring AMQP消息中间件

SpringAMQP简单说就是一个中间件&#xff0c;提供了模板方便我们操作各种消息模型 上面已经学了RabbitMQ消息队列是有五种消息模型&#xff0c;并且我们演示了其中的基本消息队列(Hello World)。用的是官方API&#xff0c;来实现的基本消息队列(Hello World)。会发现官方提供的…

华为OD-C卷-攀登者1[100分]

攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。 例如: [0,1,2,4,3,1,0,0,1,2,3,1,2,1,0],代表如下图所示的地图 地图中有两个山脉位置分别为 1,2,3,4,5 和 8,9,1…

一、OpenCvSharp环境搭建

一、Visual Studio 创建新项目 二、选择Windows窗体应用&#xff08;.NET Framework&#xff09; 直接搜索模板&#xff1a;Windows窗体应用(.NET Framework) 记得是C#哈&#xff0c;别整成VB(Visual Basic)了 PS&#xff1a;若搜索搜不到&#xff0c;直接点击安装多个工具和…

K8S哲学 - 常见的资源类型

资源类型 namespace kubectl apply 和 kubectl create kubectl apply是声明式的 和 kubectl create是命令式的对吗 deployment 和 job的区别

Fiddle配置代理,保手机模拟器访问外部网络

前言&#xff1a; 嘿&#xff01;大家好&#xff01;我来带你们玩转Fiddler和Mumu模拟器的组合技了&#xff01;此组合技能帮助你实现在模拟器上畅游外部网络。相信我&#xff0c;它会让你的开发和测试过程更加轻松愉快&#xff01;废话不多说&#xff0c;赶紧展开我们的冒险吧…

bugku-web-file_get_contents

<?php extract($_GET); if (!empty($ac)){$f trim(file_get_contents($fn));if ($ac $f){echo "<p>This is flag:" ." $flag</p>";}else{echo "<p>sorry!</p>";} } ?> 这里涉及到几个不常用的函数 这里直接构…

22.04 忘记root密码

在即将加载Ubuntu启动界面时&#xff0c;在 GRUB 引导菜单出现之前马上按住 Shift 键&#xff0c;将进入引导菜单 在引导菜单中选择 “Advanced options for Ubuntu”&#xff0c;如果是中文则显示为“Ubuntu高级选项” 接下来你会看到好几个内核版本号&#xff0c;按上下键选…

区块链安全-----接口测试-Postman

Postman是一款支持http协议的接口调试与测试工具&#xff0c;其主要特点就是功能强大&#xff0c;使用简单且易 用性好 。无论是开发人员进行接口调试&#xff0c;还是测试人员做接口测试&#xff0c;Postman都是我们的首选工具 之一 。 更早的接入测试&#xff0c;更早的发现问…

数据结构与算法

根据希赛相关视频课程汇总整理而成&#xff0c;个人笔记&#xff0c;仅供参考。 数据结构 包括逻辑结构和物理结构 线性表 一对一的关系 栈/队列&#xff1a;操作受限的线性表 串&#xff1a;由零个或多个任意字符组成的有限序列 S“a1, a2, …, an” (n≥0) 串长度&#…

69787987

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

实现智能水控 | 基于ACM32 MCU的分体式水控方案

分体式水控概述 分体式水控是一种常见的水控系统&#xff0c;它的工作原理是通过水的流动来控制水的供应和排放&#xff0c;该系统一般由两部分组成&#xff1a;控制器和水阀。控制器负责监测水的流量和压力&#xff0c;根据设定的参数来控制水阀的开和关&#xff0c;从而实现水…

何谓电子邮件加密?探讨其工作原理及多种加密形式的运用

在现今信息化社会&#xff0c;电子邮件已经成为日常生活与商务活动中无可替代的通讯手段&#xff0c;每日全球往来邮件的数量高达数十亿封&#xff0c;这些邮件中往往包含了个人隐私信息、账户密码、金融交易详情、法律文件、专利技术等内容&#xff0c;一旦落入网络不法分子之…

Amazon Bedrock 实践系列 | Claude 3 深度探秘

生成式 AI 和大模型在 2024 年已经进入落地实践阶段。因此&#xff0c;围绕开发者在生成式应用程序开发中的主要痛点和需求&#xff0c;我们组织了这个 “Amazon Bedrock 实践” 的系列&#xff0c;希望可以帮助开发者高效地上手生成式 AI 和大模型的应用开发。本篇为第二篇&am…

JavaWeb-Ajax

文章目录 1.基本介绍2.应用场景3.两种通信方式对比1.传统web通信方式2.Ajax通信方式 4.原生Ajax1.快速入门1.案例2.创建maven项目&#xff0c;导入依赖3.编写代码1.User.java2.login.html3.CheckUserServlet.java4.结果 4.后置资料5.课后作业——接入DB1.导入依赖2.创建德鲁伊连…