QT上位机开发(动态库dll的开发)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        有的时候,我们不想把所有的代码都放在一个exe里面,这个时候我们就需要引入dll动态库的概念。在windows平台上面,这个动态库就是dll文件,在linux平台上面,这个动态库就是so文件。不管是哪一种形式,它们的运行方式都是差不多的,那就是执行文件调用到具体函数的时候,才会跳到动态库执行。dll还有一个好处,那就是可以帮助我们提炼函数、类接口,实现程序的动态加载。这样软件除了问题之后,不需要重新编所有的代码,只需要更新指定的dll文件就可以。

        今天我们在编写qt软件的时候,正好也可以学习下在cpp下,函数和类是怎么做到dll里面的,且能被外面的代码调用。

1、创建一个qt widget项目

        和之前一样,创建一个qt widget项目,这个项目只是为了演示。不需要用widget在里面添加任何的内容。

2、在当前的solution里面添加一个dll项目

        直接选择solution、添加、新建项目,选择动态链接库,确认就好。这样一个dll项目就被添加到这个项目里面来了。

3、添加导出函数代码

        为了测试,我们添加一个测试函数。函数的话,按照正常的方法编写就可以了。不过有两个地方需要注意下,第一,就是需要添加一个extern "C";第二,就是添加_declspec(dllexport)。这样后续的exe文件,就可以看到这个被export出去的函数了。

// about function export
extern "C" _declspec(dllexport) int iterate(int data)
{if(data == 1)return 1;return iterate(data - 1) + data;
}

4、添加导出类代码

        除了函数,还有一些类也是要被导出来的,其实也是一样。不过和函数相比较,类如果需要导出的话,只需要添加一个_declspec(dllexport)就好了。

// about class export
class _declspec(dllexport) parent
{
public:parent() {}~parent() {}parent(parent&) {};void display() { std::cout << "display function was invoked here!" << std::endl; }
};

5、在exe可执行文件中添加函数和类的引用

        前面我们在dll当中已经实现了需要导出的函数和类。那么在exe当中如果需要使用这些类和函数的话,也需要添加相关的代码,比如像这样,

// about function import
extern "C" _declspec(dllimport) int iterate(int);// about class import
class _declspec(dllimport) parent
{
public:parent();~parent();parent(parent&);void display();
};

6、先编译dll,然后在exe中引入dll

        代码准备好了之后,就可以先编译dll。因为编译好了之后,就可以把dll库导入到exe项目当中去了。

7、exe项目中添加代码,开始测试

        所有条件都准备好了,就可以添加代码测试了,

	// test code hereint aa = iterate(10);parent pp;pp.display();

        测试的时候,可以添加断点,比如iterate是不是可以单步调试?单步调试的时候会不会跳到dll工程去?parent实例化是否成功?实例化的时候,是否可以跳到构造函数去?display类函数是不是可以执行到,是不是可以跳到dll里面去等等?这些问题都可以通过单步调试来进行处理和验证。

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

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

相关文章

IC工程师到底有哪些?每个岗位具体有哪些要求?

随着摩尔定律和技术的发展&#xff0c;芯片集成度也越来越高&#xff0c;与之伴随的就是岗位愈加细分。芯片产业链很长且环环相扣&#xff0c;每一个环节都需要不同的工程师角色分工协作。 很多人以为芯片工程师就是单纯搞芯片的工程师&#xff0c;殊不知这其中可能要分十几个…

FlagData 2.0:全面、高效的大模型训练数据治理工具集

数据是大模型训练至关重要的一环。数据规模、质量、配比&#xff0c;很大程度上决定了最后大模型的性能表现。无论是大规模的预训练数据、精益求精的SFT数据都依托于一个完整的“获取-准备-处理-分析”数据流程。然而&#xff0c;当前的开源工具通常只专注于流程中的某一环节&a…

ThreeJs通过canvas和Sprite添加标签

在3D场景中很多时候会用到给模型添加标签&#xff0c;以表示这个模型的代号&#xff0c;尤其是大量重复模型的时候&#xff0c;添加标签是为了更直观的看到场景中每个模型的数据和名称&#xff0c;比如在仓库中有很多货架&#xff0c;就会需要查看每个货架的编号&#xff0c;如…

Flink Connector 开发

Flink Streaming Connector Flink是新一代流批统一的计算引擎&#xff0c;它需要从不同的第三方存储引擎中把数据读过来&#xff0c;进行处理&#xff0c;然后再写出到另外的存储引擎中。Connector的作用就相当于一个连接器&#xff0c;连接Flink计算引擎跟外界存储系统。Flin…

ES6定义一个类(函数内部定义属性,,原型定义方法 ), 实现继承?

ES6中使用class关键字定义一个类&#xff0c;使用extends关键字实现继承。下面是一个示例&#xff1a; class Animal {constructor(name) {this.name name;}sayHello() {console.log(Hello, my name is ${this.name});} }class Dog extends Animal {constructor(name, breed)…

长亭牧云主机管理助手——免费轻量的服务器管理软件初体验

优点 安装十分简单&#xff0c;新手友好&#xff0c;一行命令搞定界面简洁&#xff0c;操作流畅无需公网 IP&#xff0c;可以面对复杂 NAT 环境进行救急可以统一管理大量主机&#xff0c;无需记住主机秘钥 地址 https://rivers.chaitin.cn/app/collie 安装 安装很简单&…

向下取整和向上取整的定义,各有什么用处。

问题描述&#xff1a;向下取整和向上取整的定义&#xff0c;各有什么用处。 问题解答&#xff1a; 向下取整&#xff08;Floor&#xff09;&#xff1a; 向下取整是指将一个实数向下舍入到最接近的、不超过它的整数。用数学符号表示为 ⌊x⌋&#xff0c;其中 x 是实数。例如&am…

基于 listmonk 的电子邮件营销解决方案

背景 电子邮件营销&#xff08;EDM&#xff09;在广告、电商、供应链物流等行业应用广泛&#xff0c;亚马逊云科技的市场部门持续不断的收到客户反馈&#xff0c;希望可以提供简单便捷的方案。 亚马逊云科技产品体验链接&#xff1a;点击我立即体验 对于发送邮件的需求&…

深耕汽车检测设备领域,引领行业技术革新

在汽车工业飞速发展的今天&#xff0c;汽车检测技术作为保障车辆安全、提升维修效率的重要手段&#xff0c;日益受到行业内外的高度关注。康士柏汽车检测线设备厂家&#xff0c;作为这一领域的佼佼者&#xff0c;凭借其深厚的技术积累和卓越的产品品质&#xff0c;正引领着行业…

c# 学习笔记 - 委托(Delegate)

文章目录 1. 委托1.1 委托概述1.2 委托使用1.3 委托的传播 2. 匿名方法2.1 匿名方法概述2.2 匿名方法 1. 委托 1.1 委托概述 委托简介 委托就是对方法的引用&#xff0c;可以理解为例如整型变量的容器可以存储整形数据&#xff0c;委托就是某种方法的容器&#xff0c;可以用来…

Future、CompletionService、CompletableFuture介绍与对比

目录 Future1、基本介绍2、按照提交任务的顺序获取执行结果 CompletionService1、介绍2、按照任务完成的先后顺序获取结果 CompletableFuture1、介绍2、CompletableFuture怎么非阻塞的获取任务结果 Future 1、基本介绍 Future是JDK1.5 提供的接口&#xff0c;是用来以阻塞的方…

python每日一题:连续子数组的最大和

这是一道关于动态规划的算法题&#xff1a; 题目描述&#xff1a; 给定一个整数数组 nums&#xff0c;请找出该数组中连续子数组的最大和&#xff0c;并返回这个最大和。 示例&#xff1a; 输入&#xff1a;[-2, 1, -3, 4, -1, 2, 1, -5, 4] 输出&#xff1a;6 解释&#xff…

如何用Rust编程访问未知结构的json串?

如何用Rust访问未知结构的JSON串&#xff0c;并包含对数组的访问&#xff1f;以下是一个简单的示例&#xff1a; use serde_json::{Value};fn main() {let json_str r#"{"name":"John","age":30,"city":"New York",&q…

数据库基础知识1

关系模型的程序员不需熟悉数据库的存取路径 在3层模式结构中,___I___是数据库的核心和关键,___Ⅱ___通常是模式的子集,数据库模式的描述提供给用户,____Ⅲ__的描述存储在硬盘上。Ⅰ.模式Ⅱ. 外模式Ⅲ. 内模式 数据库中,数据的物理独立性是指用户的应用程序与存储在磁盘上数据库…

PHP篇——html+php实现表单提交的一个简单例子

html&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><title>表单示例</title> </head> <body><!-- 创建表单 --><form action"form.php" method"po…

Rust:如何判断位置结构的JSON串的成员的数据类型

如何判断位置结构的JSON串的成员的数据类型&#xff0c;给一个Rust的例子&#xff0c;其中包含对数组的判断&#xff1f; 在Rust中&#xff0c;你可以使用serde_json库来处理JSON数据&#xff0c;并通过serde_json::Value类型的方法来判断JSON串中成员的数据类型。以下是一个示…

D6208双向直流马达驱动芯片 用于IPC产品,可兼容BA6208,噪声低 ,工作电源电压范围宽。

D6208 是一块单片双向马达驱动电路&#xff0c;它使用TTL电平的逻辑信号就能控制卡式录音机和其它电子设备中的双向马达。该电路由一个逻辑部分和一个功率输出部分组成。逻辑部分控制马达正、反转向及制动&#xff0c;功率输出部分根据逻辑控制能提供100mA&#xff08;典型值&a…

迅腾文化观察:从“占位”到“心智”,从“借势”到“锁定”—— 高增长市场的企业战略之道

迅腾文化观察&#xff1a;从“占位”到“心智”&#xff0c;从“借势”到“锁定”—— 高增长市场的企业战略之道 在当今世界&#xff0c;市场环境瞬息万变&#xff0c;企业若想在激烈的市场竞争中立足并持续发展&#xff0c;必须不断地调整和优化自身的战略。在迅腾文化观察中…

electron进程通信之预加载脚本和渲染进程对主进程通信

主进程和预加载脚本通信 主进程 mian,js 和预加载脚本preload.js,在主进程中创建预加载脚本, const createWindow () > {// Create the browser window.const mainWindow new BrowserWindow({width: 300,height: 300,// 指定预加载脚本webPreferences: {preload: path.j…