詳解 Qt 呼叫 DLL功能函式

pamxy發表於2013-07-27

轉自:http://mobile.51cto.com/symbian-271887.htm

本文介紹的是詳解 Qt 呼叫 DLL功能函式,DLL 是一個包含可由多個程式同時使用的程式碼和資料的庫,DLL不是可執行檔案。先來看內容。

AD: 2013雲端計算架構師峰會超低價搶票中

Qt 呼叫 DLL功能函式是本文要介紹的內容,DLL 是一個包含可由多個程式同時使用的程式碼和資料的庫。不說這麼多,先來看內容。

宣告: 事先我已經自己動手寫了一個簡單的DLL檔案(myDLL.dll),C版介面的。並且用我前兩篇有關DLL文章裡面的方法,從DLL中匯出了匯入庫(.lib)檔案,dll中有兩個函式,原型如下:

  1. void HelloWorld();     //函式內部呼叫Win32 API,功能是彈出一個helloworld提示框  
  2. int add(int a,int b);  //實現兩個數相加,並返回結果 

下面分別通過顯示呼叫(轉者注:顯式呼叫,以下都為顯式而非顯示)隱式呼叫兩種方法,來模擬Qt如何呼叫外部dll檔案中的功能函式,follow me....

預備知識:

1、如果在沒有匯入庫檔案(.lib),而只有標頭檔案(.h)與動態連結庫(.dll)時,我們才需要顯示呼叫,如果這三個檔案都全的話,我們就可以使用簡單方便的隱式呼叫。

2、通常Windows下程式顯示呼叫dll的步驟分為三步(三個函式):LoadLibrary()GetProcAdress()FreeLibrary()

其中,LoadLibrary() 函式用來載入指定的dll檔案,載入到呼叫程式的記憶體中(DLL沒有自己的記憶體!)

GetProcAddress() 函式檢索指定的動態連結庫(DLL)中的輸出庫函式地址,以備呼叫

FreeLibrary() 釋放dll所佔空間

1、顯示呼叫

Qt提供了一個 QLibrary 類供顯示呼叫。下面給出一個完整的例子:

  1. #include <QApplication> 
  2. #include <QLibrary> 
  3. #include <QDebug> 
  4. #include <QMessageBox> 
  5. #include "dll.h"             //引入標頭檔案  
  6. typedef int (*Fun)(int,int); //定義函式指標,以備呼叫  
  7. int main(int argc,char **argv)  
  8. {  
  9.     QApplication app(argc,argv);  
  10.     QLibrary mylib("myDLL.dll");   //宣告所用到的dll檔案  
  11.     int result;  
  12.     if (mylib.load())              //判斷是否正確載入  
  13.     {  
  14.        QMessageBox::information(NULL,"OK","DLL load is OK!");  
  15.        Fun open=(Fun)mylib.resolve("add");    //援引 add() 函式  
  16.         if (open)                  //是否成功連線上 add() 函式  
  17.         {  
  18.             QMessageBox::information(NULL,"OK","Link to Function is OK!");  
  19.             result=open(5,6);      //這裡函式指標呼叫dll中的 add() 函式  
  20.            qDebug()<<result;  
  21.        }  
  22.         else  
  23.             QMessageBox::information(NULL,"NO","Linke to Function is not OK!!!!");  
  24.     }  
  25.     else  
  26.         QMessageBox::information(NULL,"NO","DLL is not loaded!");  
  27.        return 0;  //載入失敗則退出  

myDLL.dll為自定義的dll檔案,將其複製到程式的輸出目錄下就可以呼叫。顯然,顯示呼叫程式碼書寫量巨大,實在不方便。

2、隱式呼叫

這個時候我們需要三個檔案,標頭檔案(.h)匯入庫檔案(.lib)動態連結庫(.dll),具體步驟如下:

1、首先我們把 .h 與 .lib/.a 檔案複製到程式當前目錄下,然後再把dll檔案複製到程式的輸出目錄,

2、下面我們在pro檔案中,新增 .lib 檔案的位置: LIBS+= -L D:/hitempt/api/ -l myDLL

-L 引數指定 .lib/.a 檔案的位置

-l  引數指定匯入庫檔名(不要加副檔名)

另外,匯入庫檔案的路徑中,反斜槓用的是向右傾斜的

3、在程式中include標頭檔案(我試驗用的dll是用C寫的,因此要用 extern "C" { #include "dll.h" } )

下面是隱式呼叫的例項程式碼:

  1.  #include <QApplication> 
  2.  #include <QDebug> 
  3. extern "C"    //由於是C版的dll檔案,在C++中引入其標頭檔案要加extern "C" {},注意  
  4. {  
  5.          #include "dll.h"  
  6.  }  
  7.  int main(int argv ,char **argv)  
  8.  {  
  9.         QApplication app(argv,argv);  
  10.         HelloWordl();          //呼叫Win32 API 彈出helloworld對話方塊  
  11.         qDebug()<<add(5,6);    // dll 中我自己寫的一個加法函式  
  12.         return 0;  //完成使命後,直接退出,不讓它進入事件迴圈  
  13.  } 


還是隱式呼叫方便啊,直接就可以呼叫dll中的函式.

小結:詳解 Qt 呼叫 dll 功能函式的內容介紹完了,希望本文對你有所幫助,如果還需要相關資料的話,請參考編輯推薦!

【編輯推薦】


相關文章