Qt动态调用(外部调用)SDK库(dll动态库)

Qt动态调用SDK库(dll动态库)

​​​​​​​

 之前的文章,介绍了Qt调用sdk库的方式,大家可以点击查看(Q调用SDK库(dll动态库))之前的文章,里面介绍的调用方式就是静态的调用方式。如下图所示,需要提供.h文件,dll文件和lib文件。

 本篇文章主要实现通过一个dll文件,外部动态调用的方式来调用我们的sdk库。

示例:我们以vs2015创建一个dll库,然后通过Qt MinGW编译器来动态调用这个库

一、VS创建dll库

1、创建一个dll库的工程,并命名为AddExample。

 2、添加一个addExample.h和.cpp文件

 3、添加如下头文件和cpp代码

 4、注意

我们要注意:一定要添加如下代码,表示要导出函数。

#ifndef DLLEXPORT_EXPORTS
#define DLLEXPORT_API __declspec(dllexport)
#else
#define DLLEXPORT_API __declspec(dllimport)
#endif

 同时,EXTERN_C表示防止生成的dll代码在其他编译器使用时可能会被改变。

EXTERN_C DLLEXPORT_API int add(int a, int b);

完整的代码如下:

头文件:
#pragma once
#ifndef DLLEXPORT_EXPORTS
#define DLLEXPORT_API __declspec(dllexport)
#else
#define DLLEXPORT_API __declspec(dllimport)
#endif

#include<iostream>
#include<fstream>
#include<Windows.h>

//函数定义导出接口函数(加、减、乘、除)
EXTERN_C DLLEXPORT_API int add(int a, int b);

EXTERN_C DLLEXPORT_API int subtract(int a, int b);

EXTERN_C DLLEXPORT_API int multiply(int a, int b);

EXTERN_C DLLEXPORT_API int divide(int a, int b);


cpp文件
#include "addExample.h"

int add(int a, int b)
{
	return (a + b);
}

int subtract(int a, int b)
{
	return (a - b);
}

int multiply(int a, int b)
{
	return (a * b);
}

int divide(int a, int b)
{
	return (a / b);
}

5、生成

我们可以看到生成的库。

 二、使用Qt调用创建的库

1、创建一个Qt的项目,我的编译器如下图所示:

 2、工程如下:

 3、代码如下:

头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QLibrary>
#include <QDebug>

namespace Ui {
class MainWindow;
}

typedef int (*_myadd)(int,int);
typedef int (*_mysub)(int,int);

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    //调用dll的resolve功能函数
    template<typename Func>
    bool resolveFunction(Func& f, const char* name) {
        f = (Func)m_pLib->resolve(name);    //把名为nanme的功能函数指针传递给对象功能函数f
        if (nullptr == f) {
            qDebug () << "resolve function " << name << "failed";
            return false;
        }
        qDebug() << "resolve function " << name << "success";
        return true;
    }
    
private:
    Ui::MainWindow *ui;
    
    QString m_strLibPath;   //动态库路径
    QLibrary*   m_pLib;   //指向dll的指针,记得初始化置NULL
    _myadd m_myadd; // dll中myadd类型的对象
    _mysub m_mysub;
};

#endif // MAINWINDOW_H

cpp文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    m_strLibPath = "F:/My_VsProject/VS2015_project/AddExample/Release/AddExample.dll";
    
    if (!QLibrary::isLibrary(m_strLibPath))
    {
        qDebug() << m_strLibPath << "!QLibrary::isLibrary";
    }
    m_pLib = new QLibrary(m_strLibPath);
    bool libload =false;
    if(!m_pLib->load())   //dll加载
    {
        qDebug()<<"load failed";
    }else
    {
        qDebug()<<"load succ";
        libload =true;
    }

    if(!resolveFunction(m_myadd, "add"))
    {
        qDebug()<<"failed";
    }else
    {
        int ret = m_myadd(5,8);
        qDebug()<<"ret = "<<ret;
    }
}

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

4、运行查看

运行结果如下:

本系列的文章链接如下:

Qt创建SDK库(dll动态库)并调用SDK库(dll动态库)

SDK(动态链接库dll)的封装技巧

VS2022中创建C++SDK库(dll动态库)并调用SDK库(dll动态库)

C#调用C++封装的SDK库(dll动态库)——上

C#调用C++封装的SDK库(dll动态库)——下

Qt是一个跨平台的C++应用程序开发框架,而JLink DLL是来自SEGGER的调试工具,通常用于与各种嵌入式微控制器进行通信。如果你想通过Qt在Windows环境下利用JLink DLL来读写OTP(One-Time Programmable,一次性可编程)存储器,你需要做以下几个步骤: 1. 首先,确保你已经安装了JLink SDK并配置了环境变量,使得Qt可以找到jlink dll文件。 2. 在Qt项目中,你可以创建一个QProcess对象来动态加载和管理DLL。这可以通过`QProcess::startDetached()`函数启动JLink Commander(如果它是JLink提供的命令行界面程序),然后通过标准输入和输出与它交互。 ```cpp QString command = "cmd /c jlink.exe --if SWD --memrw otp --addr YOUR_OTP_ADDRESS"; QProcess *process = new QProcess(); process->start(command); ``` 这里的`YOUR_DEVICE`, `YOUR_SPEED`, 和 `YOUR_OTP_ADDRESS`需要替换为你实际设备的信息和你要操作的具体OTP地址。 3. 接下来,你可以使用`QProcess::readAllStandardOutput()`或`QProcess::waitForFinished()`来读取命令的输出结果或检查进程是否成功完成。 4. 如果你想直接从DLL内部操作,你可能需要编写一个COM接口或者使用WinAPI函数,但这通常不是Qt推荐的方式,因为Qt本身并不支持直接操作系统级的dll。 注意:操作OTP通常需要底层驱动的支持,并且可能涉及到硬件限制和安全策略,因此在实际应用中可能需要额外的权限和特殊处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冯一川

谢谢老板对我的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值