最近在學習Qt調用C++子產品的方法,本文在結合幾篇文章的基礎上,完成了Qt調用C++動态連結庫(Dll)的方法,親測有效:
聲明:
事先我已經用C++寫了一個簡單的dll檔案(myCurve.dll)。首先,從dll中導出了導入庫(.lib)檔案,dll中有一個接口函數,原型如下:
int StartCurveTool(void);//啟動曲線工具
下面分别通過顯示調用和隐式調用兩種方法,來模拟Qt如何調用外部dll檔案中的功能函數。
建立QT工程:
建立一個預設的Widgets工程,如下圖所示
點選“Choose”按鈕後在彈出的界面中輸入工程名,然後“下一步”、“下一步”……直到“完成”即可。
添加槽信号:
輕按兩下工程下“界面檔案”中的.ui檔案,添加一個Push Button控件,改名為“曲線”,右擊該button,選擇“轉到槽”,在下面的界面中選擇clicked()信号,點選OK,添加并跳轉到槽函數on_pushButton_clicked()。
調用DLL:
1、顯示調用
Qt提供了一個 QLibrary 類供顯示調用。下面給出一個完整的例子:
include “mainwindow.h”
include “ui_mainwindow.h”
include //QLibrary 顯示不全,進行注釋
include //QDebug
include //QMessageBox
include “CurveToolExport.h”
typedef int (* startCurveToolFunc)(void);
……
……
void MainWindow::on_pushButton_clicked()
{
QLibrary myLib(“CurveTool.dll”);
if(myLib.load())
{
startCurveToolFunc start = (startCurveToolFunc)myLib.resolve(“StartCurveTool”); //啟動曲線工具
if(start)
{
start();
}
else
{
QMessageBox::information(NULL, “NO”, “Link to function is not ok!”);
}
}
else
{
QMessageBox::information(NULL, “NO”, “DLL is not loaded!”);
}
}
注意:
1) dll的接口函數要用extern “C”聲明
2) 調用時在QT中定義接口函數的指針。
2、隐式調用
這個時候我們需要三個檔案,頭檔案(.h)、導入庫檔案(.lib)、動态連結庫(.dll),具體步驟如下:
1)首先我們把 .h 與 .lib/.a 檔案複制到程式目前目錄下,然後再把dll檔案複制到程式的輸出目錄,
2)在工程檔案右鍵點選,選擇“添加庫”,彈出如下界面:
選擇“外部庫”,點選“下一步”,進入下面界面:
單擊“庫檔案”後面的“浏覽”按鈕,選擇要添加的庫檔案,本例中添加myCurve d.lib(Debug版本)/ myCurve.lib(Release版本),下面的包含路徑會自動映射到lib庫所在的目錄。
“下一步”可以看到在.pro檔案中自動生成添加代碼,直接“完成”即可。
3)代碼實作
在程式中include頭檔案(我用的dll是用C++寫的,是以要用 extern “C” { #include “dll.h” } )
下面是隐式調用的執行個體代碼:
include “mainwindow.h”
include “ui_mainwindow.h”
extern “C”
{
#include “CurveToolExport.h”
}
……
……
void MainWindow::on_pushButton_clicked()
{
StartCurveTool();
}
建構——運作,點選界面中的“曲線”按鈕,可以正确啟動曲線工具界面。
總結:
顯示調用代碼多,實作複雜;是以如果在沒有導入庫檔案(.lib),而隻有頭檔案(.h)與動态連結庫(.dll)時,我們才需要顯示調用,如果這三個檔案都全的話,我們就可以使用簡單友善的隐式調用。