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();
    }
}
  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值