CANoe的capl调用Qt制作的dll

news2024/11/17 8:47:12

闲谈

因为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.coloradmin.cn/o/1892007.html

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

相关文章

AI大模型深度学习:理论与应用全方位解析

背景 在当前技术环境下&#xff0c;AI大模型学习不仅要求研究者具备深厚的数学基础和编程能力&#xff0c;还需要对特定领域的业务场景有深入的了解。通过不断优化模型结构和算法&#xff0c;AI大模型学习能够不断提升模型的准确性和效率&#xff0c;为人类生活和工作带来更多…

wordpress企业网站模板免费下载

大气上档次的wordpress企业模板&#xff0c;可以直接免费下载&#xff0c;连注册都不需要&#xff0c;网盘就可以直接下载&#xff0c;是不是嘎嘎给力呢 演示 https://www.jianzhanpress.com/?p5857 下载 链接: https://pan.baidu.com/s/1et7uMYd6--NJEWx-srMG1Q 提取码:…

基于Java中的SSM框架实现高校学生请假管理系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现高校学生请假管理系统演示 摘要 社会经济的快速发展带来了各行各业都在推进计算机网络技术的应用。而在各行各业中&#xff0c;教育业又显得尤为重要&#xff0c;因为学生是祖国的未来。计算机网络技术也在逐步的在教育业取代原有的传统教育模式。但是…

Java [ 基础 ] HashMap详解 ✨

目录 ✨探索Java基础 HashMap详解✨ 总述 主体 1. HashMap的基本概念 2. HashMap的工作原理 3. HashMap的常用操作 4. HashMap的优缺点 总结 常见面试题 常见面试题解答 1. HashMap的底层实现原理是什么&#xff1f; 2. 如何解决HashMap中的哈希冲突&#xff1f;…

Simulink 模型生成 C 代码(四):比较模型仿真和生成代码的结果

接下来将验证生成的代码执行时在数值上等效于 Simulink 中建模的算法。您使用测试框架模型在普通模式下对 RollAxisAutopilot 进行仿真&#xff0c;并在 SIL 模式下进行仿真&#xff0c;然后使用仿真数据检查器比较这两个仿真。 要测试生成的代码&#xff0c;您可以运行软件在…

实验六 智能停车系统设计 (综合类)含源码 福利

某停车场停车费用计算规则如下: ①每小时 10 元&#xff0c;不足 1 小时的部分按照 1 小时计算; ②超过 8 小时&#xff0c;未超过 24 小时的按照 8 小时计算; ③超过 24 小时&#xff0c;超过部分按照上述标准重新计算。 本程序的任务是模拟一个智能停车管理系统&#xff0c;…

qt5.15关于qradiobutton遇到的坑

前言 不知道是只有我遇到了&#xff0c;还是qt本身就存在这个bug 当将2个qradiobutton放入到一个布局内&#xff0c;然后进行来回切换&#xff0c;若无数据刷新的情况下&#xff0c;切换无异常&#xff0c;当窗体内有数据开始刷新了&#xff0c;则点击其中一个qradiobutton&am…

考PMP一定要报培训班么?

曾有自学PMP想法学员分享&#xff1a;不如选择性价比高通过率高的PMP项目管理培训机构威班PMP 其实参加PMP考试如果非要自学也能参加考试的&#xff0c;只是需要找一个能卖给你35学时的机构&#xff0c;也只有PMI授权的PMP机构能开具35学时证明&#xff0c;这种生意也只有小机…

工厂自动化相关设备工业一体机起到什么作用?

在当今的制造业领域&#xff0c;工厂自动化已成为提高生产效率、保证产品质量和降低成本的关键。在这一进程中&#xff0c;工业一体机作为一种重要的设备&#xff0c;发挥着不可或缺的作用。 工业一体机是自动化生产线上的控制中心。它能够整合和处理来自各个传感器、执行器和其…

Hadoop3:集群压测-读写性能压测

一、准备工作 首先&#xff0c;我们要知道&#xff0c;平常所说的网速和文件大小的MB是什么关系。 100Mbps单位是bit&#xff1b;10M/s单位是byte ; 1byte8bit&#xff0c;100Mbps/812.5M/s。 测试 配置102、103、104虚拟机网速 102上用Python开启一个文件下载服务&#x…

没有找到openslide-win64xxxx文件 ! ! ! (openslide-python安装教程)

各位小伙伴大家好&#xff0c;今天给大家带来教程&#xff1a;openslide-python安装 说实话这个库我之前也没有用到过&#xff0c;然后今天代码需要&#xff0c;就安装了一下 但是在import openslide的时候报错&#xff0c;找了很多教程 说句心里话&#xff1a;那些教程都是…

又一个被催的相亲对象!家庭不和,是因为智慧不够?——早读(逆天打工人爬取热门微信文章解读)

你相亲过吗&#xff1f; 引言Python 代码第一篇 洞见 家庭不和&#xff0c;是因为智慧不够第二篇 口播结尾 引言 yue 昨天居然忘记了 正事&#xff1a;拍视频j 居然忘记了 别着急 让我找下理由&#xff08;借口&#xff09; 前天我妈给我介绍了个相亲对象 推给我了她的微信 我…

基于opencv-python开发的长度测量-角度测量算法

使用OpenCV-Python进行长度和角度测量的项目可以应用于多个领域&#xff0c;如工业自动化、机器人视觉、测绘、教育等。这类项目的核心是利用计算机视觉技术从图像或视频中提取有用的信息&#xff0c;进而计算出物体的尺寸或角度。以下是一个基于OpenCV-Python进行长度和角度测…

软考《信息系统运行管理员》-2.4信息系统运维管理标准

2.4信息系统运维管理标准 信息系统运维的相关标准 ITIL信息技术基础设施库 基于服务生命周期主要包含五个方面&#xff1a;服务战略&#xff08;轴心&#xff09;、服务设计、服务转换、服务运营及服务改进 COBIT信息系统和技术控制目标 考法1&#xff1a;概念 在ITILv3基于…

开源 复刻GPT-4o - Moshi;自动定位和解决软件开发中的问题;ComfyUI中使用MimicMotion;自动生成React前端代码

✨ 1: Moshi 法国 AI 实验室 Kyutai 刚刚推出了开源 复刻GPT-4o - Moshi Moshi是一款现代化聊天平台&#xff0c;旨在提供用户友好和高效的即时通讯体验。它整合了多种功能&#xff0c;包括文本消息、语音和视频通话、文件共享等&#xff0c;为个人用户和团队协作提供了强大的…

grid布局下的展开/收缩过渡效果【vue/已验证可正常运行】

代码来自GPT4o&#xff1a;国内官方直连GPT4o <template><div class"container"><button class"butns" click"toggleShowMore">{{ showAll ? 收回 : 显示更多 }}</button><transition-group name"slide-fade&…

Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作

章节内容 上一节我们完成了&#xff1a; MapReduce的介绍Hadoop序列化介绍Mapper编写规范Reducer编写规范Driver编写规范WordCount功能开发WordCount本地测试 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学…

【10年有效】阿里云域名,出阿里云私人子域名

出&#xff1a;阿里云私人子域名&#xff0c;主要是帮助没域名的&#xff0c;又需要使用域名绑定程序的人。 有效期十年&#xff0c;就只要几块&#xff0c;简直是薅羊毛薅到家了~~ 本域名已经备案了。 目标&#xff1a;https://h5.m.goofish.com/item?id811115711415 ---…

【楚怡杯】职业院校技能大赛 “Python程序开发”赛项样题二

Python程序开发实训 &#xff08;时量&#xff1a;240分钟&#xff09; 中国XX 实训说明 注意事项 1. 请根据提供的实训环境&#xff0c;检查所列的硬件设备、软件清单、材料清单是否齐全&#xff0c;计算机设备是否能正常使用。 2. 实训结束后&#xff0c;将各试题代码整合…

QQ录屏文件保存在哪里?一键教你快速查询

无论是记录重要的工作内容&#xff0c;还是分享生活中的点滴&#xff0c;屏幕录制都发挥着至关重要的作用。在众多屏幕录制工具中&#xff0c;qq录屏以其简单易用、功能丰富的特点&#xff0c;受到了广大用户的喜爱。本文将为您揭示qq录屏文件保存在哪里&#xff0c;帮助大家更…