日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt-调用dll动态链接库

發布時間:2023/12/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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动态链接库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。