Qt加载动态链接库

2023-11-09

Qt加载动态链接库

1、 直接在pro文件中添加

首先将.a(或者.lib)和.dll文件放入某一目录中,一般是放入程序目录下,例如在程序目录下放入了mydll.labmydll.dll文件,然后在.pro文件中添加:

LIBS += -L$$PWD/./ -lmydll

有的文章说mingw平台使用.a和.dll文件,msvc使用.lib和.dll,实测在mingw下使用.lib和.dll无任何问题

以上参数说明

-L"文件路径" -l"导入库文件名(不加扩展名)"

上述$$PWD指的是当前目录 即格式:LIBS+= -L地址 -l库名

另外也可以直接在工程上添加 ,如下:

之后Qt会自动在pro文件中加入如下语句:

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/./ -lmydll
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/./ -lmydll
else:unix: LIBS += -L$$PWD/./ -lmydll
    
#INCLUDEPATH += $$PWD/.
#DEPENDPATH += $$PWD/.

删除,只保留:

LIBS += -L$$PWD/./ -lmydll

2、LoadLibrary显示加载动态链接库(C++方法)

例如要加载当前目录下的DetTMex120T.dll文,该dll文件中包含了三个函数

这三个函数的原型为:

#define DT_API __declspec(dllimport)

//函数功能:设置数据处理函数。
//函数参数:callback为一个函数指针。该指针对应了一个返回值为void,包含五个参数(unsigned short*,unsigned short*,int,int,int)的函数。
//函数返回值:无。
DT_API void setData(void* callback);

//函数功能:获取数据。
//函数参数:无。
//函数返回值:int
DT_API int getData();

//函数功能:发送命令
//函数返回值:bool
DT_API bool sendCmd(void * data, unsigned int len);

新建一个.h和.cpp,如下:

①.h文件

#include <Windows.h>
#include <QString>

#ifndef LOAD_DLL_FILE_H
#define LOAD_DLL_FILE_H
//定义 函数指针
typedef void (__stdcall *FP_setData)(void*);  //设置数据处理函数
typedef int  (__stdcall *FP_getData)(void);       //获取数据
typedef bool (*FP_sendCmd)(void * data, unsigned int len); //发送指令

//声明
extern HINSTANCE gDLLModuleHandle;
//---------------------------------------------------------------------------

extern FP_setData gsetData;
extern FP_getData ggetData;
extern FP_sendCmd gsendCmd;

//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
bool __fastcall gGetFuncFromDLL();
bool loadDllFile();  //加载dll文件
bool loadDllFile(QString str);  //加载dll文件
//---------------------------------------------------------------------------


#endif // LOAD_DLL_FILE_H

②.cpp文件

#include "load_dll_file.h"
#include <qdebug.h>
#include <QLibrary>
#include <stringapiset.h>
#include <string>



//DLL句柄
HINSTANCE gDLLModuleHandle = NULL;

//DLL导入函数
FP_setData gsetData = NULL;
FP_getData ggetData = NULL;
FP_sendCmd gsendCmd = NULL;

//加载Dll文件  通过给定路径+文件名
bool loadDllFile(QString str)
{
    std::string s = str.toStdString();
    LPCSTR str_DLL = s.c_str();

    gDLLModuleHandle = LoadLibraryA(str_DLL);
    if(gDLLModuleHandle)
    {
        qDebug() << u8"gDLLModuleHandle加载成功!" << endl;
        return 1;
    }
    else
    {
        qDebug() << u8"gDLLModuleHandle加载失败!" << endl;
        return 0;
    }
}



//加载Dll文件
bool loadDllFile()  
{
    gDLLModuleHandle = LoadLibrary(TEXT("DetTMex120T.dll"));
    //gDLLModuleHandle = LoadLibrary(L"E:\\test\\DetTMex120T.dll");
    if(gDLLModuleHandle)
    {
        qDebug() << u8"gDLLModuleHandle加载成功!" << endl;
        return 1;
    }
    else
    {
        qDebug() << u8"gDLLModuleHandle加载失败!" << endl;
        return 0;
    }

//    //路径获取
//    TCHAR chCurDir[MAX_PATH] = {0};  //TCHAR 字符串宏
//    GetCurrentDirectory(MAX_PATH, chCurDir);  //返回当前目录
//    SetCurrentDirectory(L"D:\\dllfile\\");
//    gDLLModuleHandle = LoadLibrary(L"D:\\dllfile\\DetTMex120T.dll");
//    auto e = GetLastError();
//    SetCurrentDirectory(chCurDir);

}


bool __fastcall gGetFuncFromDLL()
{
    if(!gDLLModuleHandle)  return false;

    gsetData = (FP_setData)GetProcAddress(gDasModuleHandle,"setData") //获取 DLL 导出函数的地址
    ggetData = (FP_getData)GetProcAddress(gDasModuleHandle,"getData");
    gsendCmd = (FP_sendCmd)GetProcAddress(gDasModuleHandle,"sendCmd");

    if(!gsetData ||
       !ggetData ||
       !gsendCmd ||)
    	return false;

    return true;
}

这样就可以使用了,例如在main.cpp中使用(需要包含头文件)

int main()
{
    loadDllFile();//加载dll文件
    //loadDllFile("DetTMex120T.dll");  //或者使用加载dll文件,传递地址
    gGetFuncFromDLL(); //得到函数地址
    if(gDLLModuleHandle)
    {
        int state = ggetData();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt加载动态链接库 的相关文章

随机推荐

  • linux调整queue_depth,linux – 无法编辑/ sys / block / sdX / device / queue_depth文件

    我正在尝试使用以下命令增加SSD的队列深度值 echo 64 gt sys block sda device queue depth 但是我收到以下错误 bash echo write error Invalid argument 我尝试使
  • STM32CubeIDE HAL库操作IIC (一)配置篇

    目录 一 MX配置 使能中断 可选 DMA设置 可选 二 生成的代码 三 IIC通信的三种方式 Polling IT DMA 代码源自官方例程 1 Polling 常用 2 IT 开启中断 接收到数据时会调用回调函数 3 DMA模式 回调函
  • Qt 如何使用正则表达式 正则表达式 密码 email

    Qt 正则表达式 regular expression 详细用法查看此博客 https blog csdn net dongdong csdn article details 78574168 QRegExp regExpPsw 正则表达式
  • pytorch每日一学24(torch.quantize_per_tensor()、torch.quantize_per_channel())使用映射过程将tensor进行量化

    第24个方法 torch quantize per tensor input scale zero point dtype Tensor torch quantize per channel input scales zero points
  • 用JSP实现简单的四则运算

    用JSP实现简单的四则运算 作者 GGG166 首先定义一个Java的CompuerBean类放在beans包中用来计算两个数的四则运算 代码如下 作者 GGG166 package beans public class CompuerBe
  • 机器学习实战第一章——读书笔记

    数据挖掘 使用机器学习方法挖掘大量数据来帮助发现不太明显的规律 这称作数据挖掘 机器学习分类标准 一 有监督学习和无监督学习 1 有监督学习 提供带标签的训练集 k 近邻算法 线性回归 逻辑回归 支持向量机 SVM 决策树和随机森林 神经网
  • blender 渲染预览按钮不见了怎么办

    如果你在使用 Blender 时发现渲染预览按钮不见了 你可以尝试以下方法来解决这个问题 检查是否切换到了其他工作区 Blender 中有多个工作区 每个工作区都有自己的工具栏和面板 如果你切换到了其他工作区 渲染预览按钮可能不在屏幕上 检
  • 计算机网络基础知识--应用层协议HTTP、FTP、SMTP

    目录 1 HTTP 协议 HTTP 特点 HTTP 与HTTPS 的区别 HTTP 请求报文 HTTP 响应报文 2 FTP 协议 与TFTP 协议 FTP 协议 TFTP 协议 3 SMTP 协议 POP3协议与IMAP协议 SMTP协议
  • C语言中,数组首地址,数组元素首地址,数组名的区别

    目录 前言 一 什么是指针 二 正式介绍 1数组名和数组首元素地址 2 arr和 arr的区别 总结 前言 刚刚接触指针 一直想搞明白数组首地址 数组元素首地址 数组名的区别 花了点时间还是搞懂了 一 什么是指针 其实指针就是地址 地址就是
  • 表单嵌套表单涉及的校验和数据回显

    props中接收父组件的传值 data中定义表单的初始值 不能写成空对象 会报错 在created中对编辑的情况进行赋值 注意不能直接赋值 数据不是响应式的 需要使用到this set props formData type Object
  • Java-JavaWeb—(12)Maven

    1 Maver简介 1 1Maver是什么 Maven的本质是一个项目管理工具 将项目开发和管理过程抽象成一个项目对象模型 POM Maven是用Java语言编写的 他管理的东西统统以面向对象的形式进行设计 最终他把一个项目看成一个对象 而
  • JVM之垃圾回收机制

    垃圾回收机制 垃圾回收时机 System gc JVM垃圾回收机制决定 垃圾回收策略 如何判断对象已死 引用计数算法 可达性分析算法 需要垃圾回收的内存 方法区 元空间 堆 新生代 Young Generation 老年代 Old Gene
  • 深度学习基础学习-注意力机制(计算机视觉中)

    在网上看到很多关于注意力机制的说明 下面自己总结一下 大佬绕道 下面放几个文章的链接 添深度学习中的注意力模型 计算机视觉中的注意力机制 图像处理注意力机制Attention汇总 注意力机制详述 注意力机制总结 空间注意力机制和通道注意力机
  • Apache Kafka 编程实战-java客户端开发例子(入门教程轻松学)

    作者 稀有气体 来源 CSDN 原文 https blog csdn net liyiming2017 article details 82805479 版权声明 本文为博主原创文章 转载请附上博文链接 本入门教程 涵盖Kafka核心内容
  • 解决VNC server 连接不上的问题

    关于VNC server的配置可参考 Rock pi 开启VNC远程桌面适用于VNC KDE桌面 启动vnc server 但是连不上 因为只监听了127 0 0 1 所以需要在启动VNC server时添加参数 localhost no
  • 关于一个轻量、可靠的移动端 Vue 组件库

    最近挖掘到一个非常好用的组件库Vant 这边放一下vant官网链接 有兴趣的可以去尝试一下 Vant 4 Lightweight Mobile UI Components built on Vue 那么很多人就要问 Vant它到底好在那 我
  • npm-nrm安装执行报错问题解决

    npm nrm安装执行报错问题解决 问题一 nrm执行报错 internal validators js 124 throw new ERR INVALID ARG TYPE name string value 打开nrm目录下的cli j
  • Flutter Stack布局中定位的方式

    前言 想要记录一下Stack布局中 定位的两种方式 代码 省略无关代码 child new Column children
  • React-Hooks之useImperativeHandle使用,让父组件操纵子组件的状态和方法

    您好 如果喜欢我的文章 可以关注我的公众号 量子前端 将不定期关注推送前端好文 useImperativeHandle是react官方为了简便我们的ref操作 同时还可以让子组件返回给父组件自身的状态和方法去调用 useRef将ref绑定到
  • Qt加载动态链接库

    Qt加载动态链接库 1 直接在pro文件中添加 首先将 a 或者 lib 和 dll文件放入某一目录中 一般是放入程序目录下 例如在程序目录下放入了mydll lab和mydll dll文件 然后在 pro文件中添加 LIBS L PWD