当前位置: 首页 > news >正文

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
可能有些是没用的,可以自己尝试

相关文章:

CANoe的capl调用Qt制作的dll

闲谈 因为Qt封装了很多个人感觉很好用的库&#xff0c;所以一直想通过CAPL去调用Qt实现一些功能&#xff0c;但是一直没机会&#xff08;网络上也没看到这方面的教程&#xff09;&#xff0c;这次自己用了两天&#xff0c;踩了很多坑&#xff0c;终于是做成了一个初步的调用方…...

论如何搭建属于自己的服务器?

在现如今的数字化时代中&#xff0c;为了能够搭建网站和运行应用程序&#xff0c;很多人选择搭建属于自己的服务器&#xff0c;下面我们就来了解一下如何搭建服务器吧&#xff01; 搭建服务器我们首先需要选择适合自身需求的硬件设备&#xff0c;其中包含内存、CPU和存储等配置…...

【C++ OpenCV】机器视觉-二值图像和灰度图像的膨胀、腐蚀、开运算、闭运算

原图 结果图 //包含头文件 #include <opencv2/opencv.hpp>//命名空间 using namespace cv; using namespace std;//全局函数声明部分//我的腐蚀运算 Mat Erode(Mat src, Mat Mask, uint32_t x0, uint32_t y0) {uint32_t x 0, y 0;Mat dst(src.rows, src.cols, CV_8U…...

STMF4学习笔记RTC(天空星)

前言&#xff1a;本篇笔记参考嘉立创文档&#xff0c;连接放在最后 #RTC相关概念定义 Real-Time Clock 缩写 RTC 翻译 实时时钟&#xff0c;是单片机片内外设的一种&#xff0c;作用于提供准确的时间还有日期&#xff0c;这个外设有独立的电源&#xff0c;当单片机停止供电…...

vue数组变化的侦测***

数组变化的侦测 变更方法 vue能够侦听响应式数组的变更方法&#xff0c;并在他们被调用时触发相关更新。这些变更方法包括&#xff1a; push()pop()shift()unshift()splice()sort()reverse() 替换一个数组 变更方法&#xff0c;顾名思义&#xff0c;就是会对调用他们的原数组进…...

k8s-第十节-Ingress

Ingress 介绍 Ingress 为外部访问集群提供了一个 统一 入口&#xff0c;避免了对外暴露集群端口&#xff1b;功能类似 Nginx&#xff0c;可以根据域名、路径把请求转发到不同的 Service。可以配置 https 跟 LoadBalancer 有什么区别&#xff1f; LoadBalancer 需要对外暴露…...

webrtc gcc详解

webrtc的gcc算法(Google Congestion Control)&#xff0c;貌似国内很多文章都没有细讲&#xff0c;原理是怎么样的&#xff0c;具体怎么进行计算的。这里详解一下gcc。 gcc算法&#xff0c;主要涉及到&#xff1a; 拥塞控制的关键信息和公式 卡曼滤波算法 gcc如何使用卡曼滤…...

Linux多进程和多线程(七)进程间通信-信号量

进程间通信之信号量 资源竞争 多个进程竞争同一资源时&#xff0c;会发生资源竞争。 资源竞争会导致进程的执行出现不可预测的结果。 临界资源 不允许同时有多个进程访问的资源, 包括硬件资源 (CPU、内存、存储器以及其他外 围设备) 与软件资源(共享代码段、共享数据结构) …...

【项目日记(一)】梦幻笔耕-数据层实现

❣博主主页: 33的博客❣ ▶️文章专栏分类:项目日记◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多项目内容 目录 1.前言2.后端模块3数据库设计4.mapper实现4.1UserInfoMapper4.2BlogMapper 5.总结 1.…...

ElementUI的中国省市区级联数据插件element-china-area-data

安装 npm install element-china-area-data -S import 使用 import {provinceAndCityData,pcTextArr,regionData,pcaTextArr,codeToText, } from "element-china-area-data"; provinceAndCityData省市二级联动数据,汉字+coderegionData省市区三级联动数据pcTextAr…...

Kotlin算法:把一个整数向上取值为最接近的2的幂指数值

Kotlin算法&#xff1a;把一个整数向上取值为最接近的2的幂指数值 import kotlin.math.ln import kotlin.math.powfun main(args: Array<String>) {val number intArrayOf(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18)number.forEach {println("$…...

简单且循序渐进地查找软件中Bug的实用方法

“Bug”这个词常常让许多开发者感到头疼。即使是经验丰富、技术娴熟的开发人员在开发过程中也难以避免遭遇到 Bug。 软件中的故障会让程序员感到挫败。我相信在你的软件开发生涯中&#xff0c;也曾遇到过一些难以排查的问题。软件中的错误可能会导致项目无法按时交付。因此&…...

基于springboot+vue+uniapp的高校宿舍信息管理系统小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…...

(完整音频)DockerHub、OpenAI、GitCode,脱钩时代,我们该如何自处?

本期主播 朱峰&#xff1a;「津津乐道播客网络」创始人&#xff0c;产品及技术专家。&#xff08;微博&#xff1a;zhufengme&#xff09;高春辉&#xff1a;「科技乱炖」主播。“中国互联网站长第一人”&#xff0c;科技、互联网领域的连续创业者。&#xff08;微博&#xff1…...

macos 10.15系统下载包,macOS Catalina for mac

macOS Catalina 让你喜欢的种种 Mac 体验都更进一步。你可以领略音乐、播客这两款全新 Mac app 的表演&#xff1b;在 Mac 上畅享各款自己心爱的 iPad app&#xff1b;拿起 iPad 和 Apple Pencil&#xff0c;拓展工作空间&#xff0c;释放创意灵感&#xff1b;再打开那些平时常…...

uni.showShareMenu({}) 和 uni.showShareImageMenu({}) 的区别

ChatGPT uni.showShareMenu({}) 和 uni.showShareImageMenu({}) 是 Uni-app 中两个不同的 API&#xff0c;它们的作用和用法有所不同&#xff1a; uni.showShareMenu({}) 作用&#xff1a;用于显示当前页面的分享菜单&#xff0c;通常显示在页面的右上角&#xff08;类似于微…...

Spring Boot logback 日志文件配置

引入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency>logback-spring.xml 配置 <?xml version"1.0" encoding"UTF-8&quo…...

240705_昇思学习打卡-Day17-基于 MindSpore 实现 BERT 对话情绪识别

240705_昇思学习打卡-Day17-基于 MindSpore 实现 BERT对话情绪识别 近期确实太忙&#xff0c;此处仅作简单记录&#xff1a; 模型简介 BERT全称是来自变换器的双向编码器表征量&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;&#xff0c…...

图像处理调试软件推荐

对于图像处理的调试&#xff0c;使用具有图形用户界面&#xff08;GUI&#xff09;且支持实时调整和预览的图像处理软件&#xff0c;可以大大提高工作效率。以下是几款常用且功能强大的图像处理调试软件推荐&#xff1a; ImageJ/FijiMATLABOpenCV with GUI LibrariesNI Vision …...

Mybatis实现RBAC权限模型查询

RBAC权限模型 Role-Based Access Control&#xff0c;中文意思是&#xff1a;基于角色&#xff08;Role&#xff09;的访问控制。这是一种广泛应用于计算机系统和网络安全领域的访问控制模型。 简单来说&#xff0c;就是通过将权限分配给➡角色&#xff0c;再将角色分配给➡用…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...