Qt 加载DLL的几种方式小结

使用Qt Creator创建DLL

这里其实主要是针对Qt Creator的新手写的,下面以截图的方式进行讲解:

1.1、创建项目的时候选择,Library > C++库,然后点击“choose”按钮

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

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

1.4、在DLL中写代码,示例代码如下:

 1 #ifndef IAMDLL_H
 2 #define IAMDLL_H
 3  
 4 #include "iamdll_global.h"
 5 #include <windows.h>
 6  
 7 class IAMDLLSHARED_EXPORT IamDLL
 8 {
 9 public:
10     IamDLL();
11  
12     /**
13      * @brief 求a+b的和
14      *
15      * @param a 入参a
16      * @param b 入参b
17      * @return int
18      */
19     int add(int a, int b);
20 };
21  
22 /**
23  * @brief   求a*b
24  */
25 extern "C" int IAMDLLSHARED_EXPORT DoMult(int a, int b);
26 typedef int(WINAPI * LPFN_MULT)(int, int);
27  
28 /**
29  * @brief   求a/b
30  */
31 extern "C" int IAMDLLSHARED_EXPORT DoDiv(int a, int b);
32 typedef int(WINAPI * LPFN_DIV)(int, int);
33  
34 /**
35  * @brief   登陆参数
36  */
37 extern "C" std::string IAMDLLSHARED_EXPORT DoLogin(std::string user, std::string pswd);
38 typedef std::string(WINAPI * LPFN_LOGIN)(std::string, std::string);
39  
40  
41 #endif // IAMDLL_H

1.5、构建,然后会在默认生成的文件夹下生成几个文件:DLL文件,库文件(lib*.a)

 

加载DLL的三种方式

一、LoadLibrary方式

 1 //方法壹:使用LoadLibrary
 2     HINSTANCE hDll = LoadLibraryA("IamDLL");
 3     if(hDll)
 4     {
 5         qDebug() << "
";
 6         qDebug() << "LoadLibraryA("IamDLL") success!" ;
 7  
 8         //使用GetProcAddress,获取指向要调用的导出函数的函数指针
 9         LPFN_MULT pDoMult = (LPFN_MULT)GetProcAddress(hDll, ("DoMult"));
10         if(pDoMult)
11         {
12             qDebug() << "LoadLibraryA pDoMult: " << pDoMult(12, 3);
13         }
14         //
15         LPFN_DIV pDoDiv = (LPFN_DIV)GetProcAddress(hDll, ("DoDiv"));
16         if(pDoDiv)
17         {
18             qDebug() << "LoadLibraryA pDoDiv: " << pDoDiv(35, 5);
19         }
20         //
21         LPFN_LOGIN pDoLogin = (LPFN_LOGIN)GetProcAddress(hDll, ("DoLogin"));
22         if(pDoLogin)
23         {
24             qDebug() << "LoadLibraryA pDoLogin: " << pDoLogin("kandy", "admin").data();
25         }
26         FreeLibrary(hDll);
27     }

二、QLibrary方式

 1 //方法贰:QLibrary方式
 2     QLibrary qlib("IamDLL");
 3     if(qlib.load())
 4     {
 5         qDebug() << "
";
 6         qDebug() << "qlib.load() success!" ;
 7         LPFN_MULT pDoMult = (LPFN_MULT)qlib.resolve("DoMult");
 8         if(pDoMult)
 9         {
10             qDebug() << "qlib.load() pDoMult: " << pDoMult(12, 2);
11         }
12         //
13         LPFN_DIV pDoDiv = (LPFN_DIV)qlib.resolve("DoDiv");
14         if(pDoDiv)
15         {
16             qDebug() << "qlib.load() pDoDiv: " << pDoDiv(35, 7);
17         }
18         //
19         LPFN_LOGIN pDoLogin = (LPFN_LOGIN)qlib.resolve("DoLogin");
20         if(pDoLogin)
21         {
22             qDebug() << "qlib.load() pDoLogin: " << pDoLogin("zhouwei", "abc123").data();
23         }
24         qlib.unload();
25     }

三、静态链接的方式

1 //方法叁:使用静态链接方式(将IamDll生成的libIamDLL.a导入到本工程)
2     qDebug() << "
";
3     IamDLL _IamDLL;
4     qDebug() << "IamDLL.add : " << _IamDLL.add(121, 123);
5  
6     qDebug() << "DoMult : " << DoMult(12, 12);
7     qDebug() << "DoDiv : " << DoDiv(121, 11);
8     qDebug() << "DoLogin : " << DoLogin("hello", "test").data();
原文地址:https://www.cnblogs.com/ybqjymy/p/14188251.html