QT的C++程序加载动态链接库DLL(Linux下是so)的方式

QT加载动态链接库有三种方式:分为动态加载和静态加载两两类

1、动态加载
使用c++的函数,动态加载
typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
需要说明的是,typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);是声明想要调用的函数指针,这个函数的参数必须和DLL里 面的一样。DLLFunc1是DLL里 面 的“实际的函数名”,必须 和头文件里面声明的一样,否则将会调用失败。

bool bRet = false;
HINSTANCE hDll;
LPFNDLLFUNC1 lpfnDllFunc1; // 函数指针

hDll = LoadLibraryA("dlfs.dll");
if (hDll != nullptr) {
	lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL, "DLLFunc1");
	if (!lpfnDllFunc1) {
		FreeLibrary(hDLL);
		return SOME_ERROR_CODE;
	} else {
		// call the function
		uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
	}
    bRet = true;
}

使用QT自带的QLibrary进行加载
typedef int (*pcom_open)(int , int , int ); //定义函数指针

bool bRet = false;

int ret; //函数返回值
int port = 1; //端口
int baud = 0; //波特率
int rtsdtr = 0; //串行口485方向控制设置:

QLibrary liba("dlfs.dll");
if (liba.load) {
	//"ltm_com_open"为DLL包含的实际函数名,必须实际存在
	pcom_open open = (pcom_open)mylib.resolve("ltm_com_open");
	if (open) {
		ret = open(port, baud, rtsdtr); //在 这里调用DLL里的函数
	}
    bRet = true;
}

2、静态加载
直接手动修改.pro文件即可(也可以用QT的辅助工具,最终的效果是一样的。项目----添加库----外部库---- 选择 库文件 和 库路径 点击确定后即 在pro中生成如下的内容)

LIBS += -L$$PWD/../../libs/ -lWpsToolNew
//注意上面的-L和-l两个参数

版权声明:本文为yhj_911原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。