QT 加载DLL的几种方式小结
使用Qt Creator创建DLL这里其实主要是针对Qt Creator的新手写的,下面以截图的方式进行讲解:1.1、创建项目的时候选择,Library > C++库,然后点击“choose”按钮1.2、选择“共享库”,输入DLL的名称,然后点击“下一步”按钮,接下来的页面默认下一步即可。1.3、创建完后,工程目录结构如下1.4、在DLL中写代码,示例代码如下...
·
使用Qt Creator创建DLL
这里其实主要是针对Qt Creator的新手写的,下面以截图的方式进行讲解:
1.1、创建项目的时候选择,Library > C++库,然后点击“choose”按钮

1.2、选择“共享库”,输入DLL的名称,然后点击“下一步”按钮,接下来的页面默认下一步即可。

1.3、创建完后,工程目录结构如下

1.4、在DLL中写代码,示例代码如下:
#ifndef IAMDLL_H
#define IAMDLL_H
#include "iamdll_global.h"
#include <windows.h>
class IAMDLLSHARED_EXPORT IamDLL
{
public:
IamDLL();
/**
* @brief 求a+b的和
*
* @param a 入参a
* @param b 入参b
* @return int
*/
int add(int a, int b);
};
/**
* @brief 求a*b
*/
extern "C" int IAMDLLSHARED_EXPORT DoMult(int a, int b);
typedef int(WINAPI * LPFN_MULT)(int, int);
/**
* @brief 求a/b
*/
extern "C" int IAMDLLSHARED_EXPORT DoDiv(int a, int b);
typedef int(WINAPI * LPFN_DIV)(int, int);
/**
* @brief 登陆参数
*/
extern "C" std::string IAMDLLSHARED_EXPORT DoLogin(std::string user, std::string pswd);
typedef std::string(WINAPI * LPFN_LOGIN)(std::string, std::string);
#endif // IAMDLL_H
1.5、构建,然后会在默认生成的文件夹下生成几个文件:DLL文件,库文件(lib*.a)
加载DLL的三种方式
一、LoadLibrary方式
//方法壹:使用LoadLibrary
HINSTANCE hDll = LoadLibraryA("IamDLL");
if(hDll)
{
qDebug() << "\r\n";
qDebug() << "LoadLibraryA(\"IamDLL\") success!" ;
//使用GetProcAddress,获取指向要调用的导出函数的函数指针
LPFN_MULT pDoMult = (LPFN_MULT)GetProcAddress(hDll, ("DoMult"));
if(pDoMult)
{
qDebug() << "LoadLibraryA pDoMult: " << pDoMult(12, 3);
}
//
LPFN_DIV pDoDiv = (LPFN_DIV)GetProcAddress(hDll, ("DoDiv"));
if(pDoDiv)
{
qDebug() << "LoadLibraryA pDoDiv: " << pDoDiv(35, 5);
}
//
LPFN_LOGIN pDoLogin = (LPFN_LOGIN)GetProcAddress(hDll, ("DoLogin"));
if(pDoLogin)
{
qDebug() << "LoadLibraryA pDoLogin: " << pDoLogin("kandy", "admin").data();
}
FreeLibrary(hDll);
}
二、QLibrary方式
//方法贰:QLibrary方式
QLibrary qlib("IamDLL");
if(qlib.load())
{
qDebug() << "\r\n";
qDebug() << "qlib.load() success!" ;
LPFN_MULT pDoMult = (LPFN_MULT)qlib.resolve("DoMult");
if(pDoMult)
{
qDebug() << "qlib.load() pDoMult: " << pDoMult(12, 2);
}
//
LPFN_DIV pDoDiv = (LPFN_DIV)qlib.resolve("DoDiv");
if(pDoDiv)
{
qDebug() << "qlib.load() pDoDiv: " << pDoDiv(35, 7);
}
//
LPFN_LOGIN pDoLogin = (LPFN_LOGIN)qlib.resolve("DoLogin");
if(pDoLogin)
{
qDebug() << "qlib.load() pDoLogin: " << pDoLogin("zhouwei", "abc123").data();
}
qlib.unload();
}
三、静态链接的方式
//方法叁:使用静态链接方式(将IamDll生成的libIamDLL.a导入到本工程)
qDebug() << "\r\n";
IamDLL _IamDLL;
qDebug() << "IamDLL.add : " << _IamDLL.add(121, 123);
qDebug() << "DoMult : " << DoMult(12, 12);
qDebug() << "DoDiv : " << DoDiv(121, 11);
qDebug() << "DoLogin : " << DoLogin("hello", "test").data();
更多推荐
所有评论(0)