20、Qt使用QLibrary类调用动态链接库dll中的成员函数

一、功能说明

创建一个项目,里面包含两个子项目,

子项目1生成动态链接库dll,里面包含一个加法和一个减法;

子项目2是带界面的可执行文件exe,使用QLibrary类来调用子项目1的dll。

二、创建子项目1

新建项目,选择“其他项目”、“子目录项目”

更改总项目名称和位置

选择编译器

默认,点击"完成&添加子项目"

选择子项目1模板,“Library”、“C++库”

更改类型和名称

默认

默认

默认

完成后,项目文件结构如下

右击“LibraryDll”,添加新文件

选择C++、C++ Class

更改名称

默认

在LibraryDll.pro中添加代码,更改子项目1的dll生成位置

#-------------------------------------------------
#
# Project created by QtCreator 2023-09-27T14:10:33
#
#-------------------------------------------------

QT -= gui

TARGET = LibraryDll
TEMPLATE = lib

DEFINES += LIBRARYDLL_LIBRARY

CONFIG(debug , debug | release) {
win32:!wince{
DESTDIR = $$PWD/../dll
}
unix {
DESTDIR = $$PWD/../dll
}
} else {
win32:!wince{
DESTDIR = $$PWD/../dll
}
unix {
DESTDIR = $$PWD/../dll
}
}

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
librarydll.cpp \
dllmain.cpp

HEADERS += \
librarydll.h \
librarydll_global.h \
dllmain.h

unix {
target.path = /usr/lib
INSTALLS += target
}

更改librarydll.h代码如下

#ifndef LIBRARYDLL_H
#define LIBRARYDLL_H

#include "librarydll_global.h"

class LIBRARYDLLSHARED_EXPORT LibraryDll
{

public:
    LibraryDll();

    int addFun(int , int);
    int subFun(int , int);
};

#endif // LIBRARYDLL_H

更改librarydll.cpp代码如下

#include "librarydll.h"

LibraryDll::LibraryDll()
{
}

int LibraryDll::addFun(int value1, int value2)
{
    return (value1 + value2);
}

int LibraryDll::subFun(int value1, int value2)
{
    return (value1 - value2);
}

更改dllmain.h代码如下

#ifndef DLLMAIN_H
#define DLLMAIN_H

#include "librarydll_global.h"

extern "C" LIBRARYDLLSHARED_EXPORT int addFun(int , int);
extern "C" LIBRARYDLLSHARED_EXPORT int subFun(int , int);

#endif // DLLMAIN_H

更改dllmain.cpp代码如下

#include "dllmain.h"
#include "librarydll.h"

static LibraryDll LibraryInstance;

int addFun(int value1, int value2)
{
    return LibraryInstance.addFun(value1, value2);
}

int subFun(int value1, int value2)
{
    return LibraryInstance.subFun(value1, value2);
}

右击“LibraryDll”,重新构建

构建完成后,在dll目录下生成dll

三、创建子项目2

右击“MyLibrary”,新子项目

选择“Application”、Qt Widgets Application

更改子项目2名称

默认

默认

默认

在mainwindow.ui中添加如下控件

 更改mainwindow.h代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

//定义函数指针
typedef int (*addFun)(int , int);
typedef int (*subFun)(int , int);

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

更改mainwindow.cpp代码

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLibrary>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    QString path = QApplication::applicationDirPath() + "/LibraryDll.dll";

    QLibrary dllLib;
    dllLib.setFileName(path);
    if(dllLib.load())
    {
        addFun myFun = reinterpret_cast<addFun>(dllLib.resolve("addFun"));
        int ret = myFun(ui->lineEdit->text().toInt(), ui->lineEdit_2->text().toInt());
        ui->label->setText(QString::number(ret));

        dllLib.unload();
    }
    else
    {
        ui->label->setText("load dll error: " + dllLib.errorString());
    }
}

void MainWindow::on_pushButton_2_clicked()
{
    QString path = QApplication::applicationDirPath() + "/LibraryDll.dll";

    QLibrary dllLib;
    dllLib.setFileName(path);
    if(dllLib.load())
    {
        subFun myFun = reinterpret_cast<subFun>(dllLib.resolve("subFun"));
        int ret = myFun(ui->lineEdit->text().toInt(), ui->lineEdit_2->text().toInt());
        ui->label->setText(QString::number(ret));

        dllLib.unload();
    }
    else
    {
        ui->label->setText(dllLib.errorString());
    }
}

四、运行测试

输入5和3,点击加法

再点击减法

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

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

相关文章

搭建react+ant design pro+umi 项目框架

一、 写本文的原因 我搭建reactantdumi这个框架的原始资料主要是来源于&#xff08;ReactUmi4从零快速搭建中后台系统保姆级记录教程&#xff08;一、项目创建及初始化&#xff09;&#xff09; 而我写这篇文章的本意就是用来记录我用搭建时候的步骤汇总。 二、 npm和node版…

Vue 官方周报 #125 - 强制重新渲染Vue组件的最佳方法

Hi &#x1f44b; 圣诞快乐&#x1f384;&#x1f389; 如果您需要强制重新渲染Vue组件&#xff0c;那么您很可能会遇到Vue的响应系统问题。根据我的经验&#xff0c;您可能没有正确使用Vue的响应系统。 但是在某些情况下确实需要强制重新渲染组件。一个例子是当您使用与Vue的…

压力应变电桥信号隔离放大变送器差分输入变送直流模块0-10mV/0-20mV/0-±10mV/0-±20mV转0-5V/0-10V/4-20mA

主要特性 DIN11 IPO 压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号导轨安装变送模块。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。此系列模块内部嵌入了一个高效微功率的电源&#xff0c;向输入端和输…

Qt/C++控件设计器/属性栏/组态/可导入导出/中文属性/串口网络/拖曳开发

一、功能特点 自动加载插件文件中的所有控件生成列表&#xff0c;默认自带的控件超过120个。拖曳到画布自动生成对应的控件&#xff0c;所见即所得。右侧中文属性栏&#xff0c;改变对应的属性立即应用到对应选中控件&#xff0c;直观简洁&#xff0c;非常适合小白使用。独创属…

一个利用摸鱼时间背单词的软件

大家好&#xff0c;我是 Java陈序员。 最近进入了考试季&#xff0c;各种考试&#xff0c;英语四六级、考研、期末考等。不知道大家的英语四六级成绩怎么样呢&#xff1f; 记得大学时&#xff0c;英语四级都是靠高中学习积累的老本才勉强过关。 而六级则是考了多次&#xff…

免 费 搭 建 小程序商城,打造多商家入驻的b2b2c、o2o、直播带货商城

在数字化时代&#xff0c;电商行业正经历着前所未有的变革。鸿鹄云商的saas云平台以其独特的架构和先进的理念&#xff0c;为电商行业带来了全新的商业模式和营销策略。该平台涉及多个平台端&#xff0c;包括平台管理、商家端、买家平台、微服务平台等&#xff0c;涵盖了pc端、…

SD卡写保护怎么解除?这3个方法很实用!

“我的sd卡用了很久了&#xff0c;一直都可以正常使用的&#xff0c;但是最近不知道为什么&#xff0c;突然就显示sd卡写保护了。我无法存入任何数据&#xff0c;请问有什么方法可以解决该问题吗&#xff1f;” SD卡是一种常见的存储设备&#xff0c;被广泛应用于手机、相机、平…

HTTP分数排行榜

HTTP分数排行榜 介绍一、创建数据库二、创建PHP脚本三、上传下载分数四、测试 介绍 Unity中向服务器发送用户名和得分&#xff0c;并存入数据库&#xff0c;再讲数据库中的得分按照降序的方式下载到Unity中。 一、创建数据库 首先&#xff0c;我们要在MySQL数据库中建立一个…

台灯品牌哪个更适合考研用?五款品质好的台灯推荐

护眼台灯是当下十分热门火爆的照明工具&#xff0c;就算是在众多的照明器材中护眼台灯也凭借着自身独特优势的赢得了众多消费者的喜爱。但问题也接踵而至&#xff0c;消费者们要如何避开市面上光线刺眼、稳定性差的护眼台灯呢&#xff1f;关于护眼台灯如何选购的问题大家不用担…

使用静态HTTP进行缓存:提高网站性能的关键

大家好&#xff0c;今天我们来聊聊如何通过使用静态HTTP进行缓存&#xff0c;来提高网站的“奔跑速度”。没错&#xff0c;就像给网站穿上了一双“风火轮”&#xff0c;让它飞得更快&#xff01; 首先&#xff0c;我们来了解一下什么是缓存。简单来说&#xff0c;缓存就是把你…

Python遥感影像深度学习指南(2)-在 PyTorch 中创建自定义数据集和加载器

在上一篇 文章中,我们Fast.ai 在卫星图像中检测云轮廓,检测物体轮廓被称为语义分割。虽然我们用几行代码就能达到 96% 的准确率,但该模型无法考虑数据集中提供的所有输入通道(红、绿、蓝和近红外)。问题在于,深度学习框架(如 Keras、Fast.ai 甚至 PyTorch)中的大多数语…

JavaOOP篇----第十六篇

系列文章目录 文章目录 系列文章目录前言一、a=a+b与a+=b有什么区别吗?二、final、finalize()、finally三、JDBC操作的步骤四、在使用jdbc的时候,如何防止出现sql注入的问题。前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击…

知行之桥EDI系统功能介绍之导入导出配置和嵌入式示例工作流

我们的产品团队正在简化用户使用已配置的 Arc Flows 的过程。我们主要通过两种方式改进了这种体验&#xff1a; 导入/导出配置嵌入式示例流 在本文中&#xff0c;我们将介绍这些新功能&#xff0c;以及它们如何使我们的用户更轻松地使用知行之桥 EDI 系统的工作流。 导入/导…

基于OpenCV的图像颜色与形状识别设计与实现实验指导书

基于OpenCV的图像颜色与形状识别设计与实现实验指导书 一、实验目的&#xff1a; 通过本实验&#xff0c;学生将了解图像颜色与形状的基本概念&#xff0c;并掌握使用OpenCV进行图像颜色与形状识别的方法。具体操作包括图像剪裁、颜色识别、轮廓检测。 二、实验器材&#xff…

C/C++ for循环的步长问题

在使用for循环中,我们使用最多的时或--。这都是循环1或-1。可以通过修改更新表达式来修改步长。如&#xff0c;我们可以根据需要将循环计数递增。在这种时候我们就不再使用i,而是使用的iin的表达式。实际上i就是ii1的缩写&#xff0c;i--是ii-1的缩写。 示例源码&#xff1a; …

Java商城免 费 搭 建:VR全景到SAAS,各种模式一网打尽!

一、技术选型 java开发语言&#xff1a;java是一种跨平台的编程语言&#xff0c;适用于大型企业级应用开发。使用java开发直播商城可以保证系统的稳定性和可扩展性。 spring boot框架&#xff1a;spring boot是一个快速构建spring应用的框架&#xff0c;简化了开发过程&#xf…

SATA和M.2接口的异同点

SATA和M.2接口是连接存储设备的两种常见接口&#xff0c;它们在物理尺寸、传输速度、线缆和接头以及适用设备类型等方面有着显著的异同点。 物理尺寸 SATA接口通常用于2.5英寸硬盘、3.5英寸硬盘等传统机械硬盘以及SSD&#xff0c;而M.2接口则是一种较为新型的接口标准&#xff…

mysql原理--基于成本的优化

1.什么是成本 我们之前老说 MySQL 执行一个查询可以有不同的执行方案&#xff0c;它会选择其中成本最低&#xff0c;或者说代价最低的那种方案去真正的执行查询。不过我们之前对 成本 的描述是非常模糊的&#xff0c;其实在 MySQL 中一条查询语句的执行成本是由下边这两个方面组…

【并发编程篇】读锁readLock()和写锁writeLock()

文章目录 &#x1f6f8;情景引入⭐解决问题 readLock()和writeLock()都是ReadWriteLock接口中定义的方法&#xff0c;用于获取读锁和写锁。 readLock()方法返回一个读锁&#xff0c;允许多个线程同时获取该锁&#xff0c;以进行并发读取操作。如果当前已有一个写锁或其他线程正…

redis哨兵+redis主从复制(在虚拟机centos的docker下)

1.安装docker Docker安装(CentOS)简单使用-CSDN博客 2.redis主从复制 redis主从复制(在虚拟机centos的docker下)-CSDN博客 3.编辑3个redis配置 cd /etc mkdir redis-sentinel cd redis-sentinel/ wget http://download.redis.io/redis-stable/sentinel.confcp sentinel.co…