windows下qt使用動態連結程式庫的方法

來源:互聯網
上載者:User

原文出處:http://www.cnblogs.com/hicjiajia/archive/2010/08/27/1810239.html

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

   void HelloWorld();
    //函數內部調用Win32 API,功能是彈出一個helloworld提示框

   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;  //載入失敗則退出

28}

 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中的函數...

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.