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() << "\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();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM