使用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() << "\r\n"; 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() << "\r\n"; 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() << "\r\n"; 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();