Qt加载动态链接库
1、 直接在pro文件中添加
首先将.a(或者.lib)和.dll文件放入某一目录中,一般是放入程序目录下,例如在程序目录下放入了mydll.lab
和mydll.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();
}
}