CANoe的capl调用Qt制作的dll

闲谈

因为Qt封装了很多个人感觉很好用的库,所以一直想通过CAPL去调用Qt实现一些功能,但是一直没机会(网络上也没看到这方面的教程),这次自己用了两天,踩了很多坑,终于是做成了一个初步的调用方案,虽然有点麻烦,但是以后可能会让自己提高很多的效率。
之前的方案是通过Qt制作面板,然后CAPL和Qt通过tcp/udp进行通讯,实现了部分功能
现在是直接封装成dll,不需要单独打开Qt程序的界面
废话结束,进入正题

制作Qt的DLL

可以参考这个博主的博客
https://www.cnblogs.com/susiesnai-sun/p/16872488.html

我的dll是解析HEX,BIN,S19文件的,虽然这个可以capl解决,但是为了复用,还是做了一个
如下图
.pro
在这里插入图片描述
.h在这里插入图片描述
.cpp
在这里插入图片描述
因为涉及公司相关的东西,.CPP不全,只当作参考,但是过程很明显

制作capl dll

打开CANoe给定的制作dll的demo,下附制作的代码,可以参考。在这里遇到一些问题,生成的dll在CANoe调用的时候,总是加载库函数失败,通过自己新建c++项目发现,因为是dll调用dll,我猜是因为项目的路径有问题,然后把对应的dll全部放到项目路径下才加载成功。切记。

HANDLE hThead;
uint16_t File_flag = 0;
char fileName[10000] = "";
typedef uint8_t(*BOOTFILERED)(char[], uint8_t*, uint64_t&); // 定义函数指针类型
HMODULE hLib = NULL;
uint8_t fileData[10000000];
uint64_t fileDataLength = 0;DWORD _stdcall readFileThread(LPVOID p)
{if (File_flag == 1){BOOTFILERED readS19;// 导出函数地址readS19 = (BOOTFILERED)GetProcAddress(hLib, "readS19");readS19(fileName, fileData, fileDataLength);}else if (File_flag == 2){BOOTFILERED readHex;// 导出函数地址readHex = (BOOTFILERED)GetProcAddress(hLib, "readHex");readHex(fileName, fileData, fileDataLength);}else if (File_flag == 2){BOOTFILERED readBin;// 导出函数地址readBin = (BOOTFILERED)GetProcAddress(hLib, "readBin");readBin(fileName, fileData, fileDataLength);}else {return 4;}return 0;
}uint64_t CAPLEXPORT CAPLPASCAL readFile(char file[], uint16_t flag)
{if (hLib == NULL)//检测是否加载dll成功{hLib = LoadLibrary("bootloadReadFile.dll");if (hLib == NULL)//检测是否加载dll成功{printf("加载DLLTest1.dll动态库失败\n");return 1;}}strncpy(fileName, file, strlen(file));File_flag = flag;DWORD dwThreadID;hThead = CreateThread(NULL, 0, readFileThread, 0, 0, &dwThreadID);return 0;}uint64_t CAPLEXPORT CAPLPASCAL getData(uint8_t *data)
{for (uint64_t i = 0; i < fileDataLength; i++){data[i] = fileData[i];}return fileDataLength;
}// ============================================================================
// CAPL_DLL_INFO_LIST : list of exported functions
//   The first field is predefined and mustn't be changed!
//   The list has to end with a {0,0} entry!
// New struct supporting function names with up to 50 characters
// ============================================================================
CAPL_DLL_INFO4 table[] = {
{CDLL_VERSION_NAME, (CAPL_FARCALL)CDLL_VERSION, "", "", CAPL_DLL_CDECL, 0xabcd, CDLL_EXPORT },{"bootloadReadFile",            (CAPL_FARCALL)readFile,          "BootloadFile","flag:1,s19;2,hex;3,bin",'U', 2, "CL", "\001\000", {"fileName","flag"}},{"bootloadGetData",            (CAPL_FARCALL)getData,          "BootloadFile","Suggested array length is 100000000",'U', 1, "B", "\001", {"fileData"}},
{0, 0}
};

在这里插入图片描述

CAPL调用dll

如上一条所说,dll调用dll可能会出现问题,需要先把需要的dll加载进去
通过下图CANoe这里有一个介绍
在这里插入图片描述
1:我选择了第一条方案,我的路径是“C:\Program Files\Vector CANoe 15\Exec32”,仅作参考。
对应的dll获取方式,自己写一个Qt窗口工程,然后选择32位的mingw的Release生成.exe文件。将此EXE文件复制粘贴到一个单独空白的文件夹里面,通过下图打开cmd窗口,进入到建立的目录下,执行windeployqt +“文件名”,获取库函数,然后把.exe删掉就可以了。看下下图

在这里插入图片描述
在这里插入图片描述
2:将上面生成的dll,复制粘贴到路径(C:\Program Files\Vector CANoe 15\Exec32 这个是我的,具体看自己)

CANoe实现

/*@!Encoding:936*/
includes
{#pragma library("capldll.dll")}variables
{}testcase readHEX()
{byte hahha[10000000];int i=0;qword testdd=0;write("哈哈哈  %d", bootloadReadFile("C:\\Users\\xiaoshuai\\Desktop\\test\\ED_C001_04_R2_CL_SV1.2_20221019.hex",2));testWaitForTimeout(1000);// bootloadGetData(hahha,testdd);write("当前数据 %I64u",testdd=bootloadGetData(hahha));for(i=0;i<testdd;i=i+16){write("%d  %02x",i/16,hahha[i]);}}void MainTest ()
{readHEX();
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

视频演示

之后加

总结

以上说明完成,记住几个踩坑点
1:vs2019中dll和sln放在同一个路径
2:CANoe的数字不能用指针
3:CANoe记得放入DLL
可能有些是没用的,可以自己尝试

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件系统技术架构分析

一文读懂&#xff1a;什么是文件系统 &#xff0c;有哪几类&#xff1f; ▉ 什么是文件系统&#xff1f; 技术大拿眉头皱了皱&#xff0c;忍住快要爆发的情绪。解释到&#xff1a; 数据以二进制形式存储于介质&#xff0c;但高低电平含义难解。文件系统揭秘这些二进制背后的意…

运维Tips | Ubuntu 24.04 安装配置 xrdp 远程桌面服务

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] Ubuntu 24.04 Desktop 安装配置 xrdp 远程桌面服务 描述&#xff1a;Xrdp是一个微软远程桌面协议&#xff08;RDP&#xff09;的开源实现&#xff0c;它允许我们通过图形界面控制远程系统。这里使…

前端面试题(CSS篇四)

一、CSS 优化、提高性能的方法有哪些&#xff1f; 加载性能&#xff1a; &#xff08;1&#xff09;css压缩&#xff1a;将写好的css进行打包压缩&#xff0c;可以减少很多的体积。 &#xff08;2&#xff09;css单一样式&#xff1a;当需要下边距和左边距的时候&#xff0c;很…

商品期货多因子 全市场对冲模型

商品期货多因子 全市场对冲模型 本文由量化投资训练营撰写&#xff0c;首发于聚宽社区。无论是写公众号&#xff0c;还是身处从业环境&#xff0c;我们一直偏向资产配置和FICC&#xff08;Fixed income Currencies & Commodities&#xff0c;译为固定收益证券、货币及商品期…

Postman深度解析:打造高效接口测试自动化流程

《Postman深度解析&#xff1a;打造高效接口测试自动化流程》 一、概述与Postman核心优势 1. 接口测试的重要性与挑战 接口测试是确保软件系统各组成部分能够正确交互的关键环节。随着现代软件系统的复杂性增加&#xff0c;接口的数量和类型也在不断增长&#xff0c;这给接口测…

【工具分享】Gophish

文章目录 Gophish安装方式功能简介 Gophish Gophish 是一个开源的网络钓鱼框架&#xff0c;它被设计用于模拟真实世界的钓鱼攻击&#xff0c;以帮助企业和渗透测试人员测试和评估他们的网络钓鱼风险。Gophish 旨在使行业级的网络钓鱼培训对每个人都是可获取的&#xff0c;它易…

MeEdu网校系统搜索功能问题处理

MeEdu通过 MeiliSearch 实现全文搜索服务。 一、下载 MeiliSearch 程序 https://github.com/meilisearch/MeiliSearch/releases/tag/v0.24.0 只能下载 v0.24.0 版本&#xff0c;其版本不支持 下载 meilisearch-linux-amd64就可以了 二、上传 MeiliSearch 三、启动命令如下…

python爬虫入门(一)之HTTP请求和响应

一、爬虫的三个步骤&#xff08;要学习的内容&#xff09; 1、获取网页内容 &#xff08;HTTP请求、Requests库&#xff09; 2、解析网页内容 &#xff08;HTML网页结构、Beautiful Soup库&#xff09; 3、存储或分析数据 b站学习链接&#xff1a; 【【Python爬虫】爆肝两…

基于大象机器人UltraArm P340机械臂和传送带,实现教育场景中的自动化分拣系统!

引言 今天我们将展示一个高度自动化的模拟场景&#xff0c;展示多个机械臂与传送带协同工作的高效分拣系统。在这个场景中&#xff0c;机械臂通过视觉识别技术对物体进行分类&#xff0c;并通过精确的机械操作将它们放置在指定的位置。这一系统不仅提高了分拣的速度和准确性&am…

CH12_函数和事件

第12章&#xff1a;Javascript的函数和事件 本章目标 函数的概念掌握常用的系统函数掌握类型转换掌握Javascript的常用事件 课程回顾 Javascript中的循环有那些&#xff1f;Javascript中的各个循环特点是什么&#xff1f;Javascript中的各个循环语法分别是什么&#xff1f;…

什么是医学影像数据?

医学影像数据是指通过各种影像技术获取的人体内部结构和功能的可视化数据。这些影像技术包括但不限于X射线、计算机断层扫描&#xff08;CT&#xff09;、磁共振成像&#xff08;MRI&#xff09;、超声波&#xff08;US&#xff09;和正电子发射断层扫描&#xff08;PET&#x…

【ue5】虚幻5同时开多个项目

正常开ue5项目我是直接在桌面点击快捷方式进入 只会打开一个项目 如果再想打开一个项目需要进入epic 再点击启动就可以再开一个项目了

Hadoop-16-Hive HiveServer2 HS2 允许客户端远程执行HiveHQL HCatalog 集群规划 实机配置运行

章节内容 上一节我们完成了&#xff1a; Metastore的基础概念配置模式&#xff1a;内嵌模式、本地模式、远程模式实机配置远程模式 并测试 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 V…

昇思25天学习打卡营第13天|K近邻算法实现红酒聚类

K近邻算法&#xff08;K-Nearest-Neighbor, KNN&#xff09;是一种用于分类和回归的非参数统计方法&#xff0c;是机器学习最基础的算法之一。它正是基于以上思想&#xff1a;要确定一个样本的类别&#xff0c;可以计算它与所有训练样本的距离&#xff0c;然后找出和该样本最接…

牛客链表题:BM1 反转链表(取头放尾法)

描述 给定一个单链表的头结点pHead(该头节点是有值的&#xff0c;比如在下图&#xff0c;它的val是1)&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链表的表头。 数据范围&#xff1a; 0≤&#x1d45b;≤10000≤n≤1000 要求&#xff1a;空间复杂度 &…

数据埋点从入门到了解

想讲讲为什么有埋点&#xff0c;举个例子 目录 什么是埋点&#xff1f;用途小红书上 埋点的主要类型代码示例1. 代码埋点前端埋点后端埋点 (Node.js 示例) 2. 全埋点示例3. 可视化埋点示例 解释常见问题埋点管理系统结论 王五是一名数据分析师&#xff0c;负责分析公司产品的用…

C++语言相关的常见面试题目(三)

1. List底层实现原理 省流&#xff1a; list底层实现了一个双向循环链表。 每个元素&#xff08;或节点&#xff09;包含三个部分&#xff1a;数据域(_M_Storage)、前驱指针(_M_prev)、后继指针(_M_next)。 数据域&#xff1a;存储实际数据。 前驱指针&#xff1a;指向链表中…

Mysql 数据库主从复制-CSDN

查询两台虚拟机的IP 主虚拟机IP 从虚拟机IP服务 修改对应的配置文件 查询对应配置文件的命令 find / -name my.cnf编辑对应的配置文件 主 my.cnf &#xff08;部分配置&#xff09; [mysqld] ########basic settings######## server_id 1 log_bin /var/log/mysql/mysql-…

[激光原理与应用-98]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 2 - 什么是激光器焊接? 常见的激光焊接技术详解

目录 一、什么是激光焊接 1.1 概述 1.2 激光焊接的优点 二、激光焊接的应用 2.1 哪些场合必须使用激光焊接 1. 汽车制造业 2. 航空航天领域 3. 电子行业&#xff1a;消费类电子3C 4. 医疗器械制造 5. 新能源锂电池行业 6. 其他领域 三、激光焊接的分类 3.1 按焊接…

【ONLYOFFICE8.1】ONLYOFFICE8.1版本桌面编辑器测评

有宝子说office太贵&#xff0c;不适合个人和学生&#xff0c;而WPS不仅贵广告还多&#xff0c;那么有没有一款软件可以替代office和WPS呢&#xff1f;...当然有喽。当当当当&#xff01;它就是众望所归、备受好评的ONLYOFFICE。下面就和小编一起来探索和测评一下ONLYOFFICE8.1…