Qt-调用dll动态链接库
事先寫一個簡單的dll文件(myDLL.dll),C版接口的。并且用我前兩篇有關DLL文章里面的方法,從dll中導出了導入庫(.lib)文件,dll中有兩個函數,原型如下:
???void?HelloWorld(); ? ??//函數內部調用Win32 API,功能是彈出一個helloworld提示框???int?add(int?a,int?b); ?//實現兩個數相加,并返回結果
?下面分別通過顯示調用和隱式調用兩種方法,來模擬Qt如何調用外部dll文件中的功能函數
預備知識:
?? ? 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中的函數
總結
以上是生活随笔為你收集整理的Qt-调用dll动态链接库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 8: LocalDate、Lo
- 下一篇: elasticsearch 安装( 阿里