原文出處: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中的函數...