本文共 1169 字,大约阅读时间需要 3 分钟。
QT加载动态链接库有两种主要方式:动态加载和静态加载。以下将详细介绍这两种方法。
动态加载是通过调用C++函数来实现的。首先需要定义一个函数指针类型:
typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD, UINT);
这里,LPFNDLLFUNC1 是我们想要调用的函数指针类型。需要注意的是,函数的参数类型和顺序必须与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 { // 调用函数 uReturnVal = lpfnDllFunc1(dwParam1, uParam2); } bRet = true;} QT提供了QLibrary类来简化动态链接库的加载过程。定义函数指针类型:
typedef int (*pcom_open)(int, int, int);
使用QLibrary实现动态加载的代码示例如下:
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)liba.resolve("ltm_com_open"); if (open) { ret = open(port, baud, rtsdtr); } bRet = true;} 静态加载的实现方式是通过在项目的.pro文件中手动添加库文件。可以通过以下命令实现:
LIBS += -L$$PWD/../../libs/ -lWpsToolNew
注意:-L 和 -l 参数需要同时使用,以确保正确加载库文件。
转载地址:http://vcxfk.baihongyu.com/