天天看點

Qt調用C++動态連結庫include “mainwindow.h”include “ui_mainwindow.h”include //QLibrary 顯示不全,進行注釋include //QDebuginclude //QMessageBoxinclude “CurveToolExport.h”include “mainwindow.h”include “ui_mainwindow.h”

最近在學習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)時,我們才需要顯示調用,如果這三個檔案都全的話,我們就可以使用簡單友善的隐式調用。

繼續閱讀