IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Qt加载动态链接库 -> 正文阅读

[C++知识库]Qt加载动态链接库

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();
    }
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-24 00:18:35  更:2022-03-24 00:19:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:34:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码