VS-Qt環境下dll


首先,不得不承認的是,Qt中的數據類型使用很方便,當我們的主框架是基於Qt的時候也就沒必要刻意追求輔助函數所在的dll是Win32的(如果原功能函數就是只使用標准庫及基礎類型,那也可以在Qt框架中調用,這不是本篇的重點)。我們之所以要使用QtLibrary是不考慮整合舊代碼的情況下方便我們編寫Qt程序的時候實現界面與功能的分離。

1.創建庫

1)創建QtLibrary項目,並進行相關設置。

2)根據需要在圖2張選擇dll需要的庫;

3)輸入ClassName,注意,下面兩個選項不要勾選,除非想生成靜態庫的情況下需要勾選第二個。

接下來需要對代碼進行改造。

4)正常情況下,會生成三個文件,分別為:DLLTest.h、DLLTest.cpp以及DLLTest_global.h

前兩個文件自不必說,主要是第三個文件,大致是這樣:

 1 #ifndef DLLTEST_GLOBAL_H
 2 #define DLLTEST_GLOBAL_H
 3 
 4 #include <QtCore/qglobal.h>
 5 
 6 #ifdef DLLTEST_LIB
 7 # define DLLTEST_EXPORT Q_DECL_EXPORT
 8 #else
 9 # define DLLTEST_EXPORT Q_DECL_IMPORT
10 #endif
11 
12 #endif // DLLTEST_GLOBAL_H

發現這個頭文件中其實並沒有起到實際作用的代碼,無非是一些宏定義(# define DLLTEST_EXPORT Q_DECL_EXPORT 和 # define DLLTEST_EXPORT Q_DECL_IMPORT),這段代碼在Win32下也經常見到,所以為了減輕調用時的負擔,選擇移除它,當然需要對DLLTest.h進行一些小改動,將這段代碼寫進來,或者,直接舍棄這段代碼。

5)將代碼直接拷貝到DLLTest.h(當然不包括前三行)中的方法很簡單,着重說一下第二種。

因為通過觀察Q_DECL_EXPORT本身就是一個宏定義,它的“廬山真面目”就是“_declspec(dllexport)”所以我們將頭文件改造成:

 1 #ifndef DLLTEST_H
 2 #define DLLTEST_H
 3 
 4 //#include "dlltest_global.h"
 5 //#include <QtCore/qglobal.h>
 6 #include <QString>
 7 #include <QDateTime>
 8 
 9 class _declspec(dllexport) dllTest
10 {
11 public:
12     dllTest();
13     ~dllTest();
14 
15     void setStr(const QString& str);    //成員函數,傳入QString變量
16     QString getStr();    //成員函數,返回改造后的QString變量
17 
18 private:
19     QString m_str;    //成員變量
20 };
21 
22 #endif // DLLTEST_H
DLLTest.h

注意:由於頭文件中沒有include任何頭文件,所以無論我們需要使用任何類型都要手動包含,至於是否寫在頭文件中視情況而定。

6)緊接着我們實現成員函數:

 1 #include "dlltest.h"
 2 
 3 dllTest::dllTest()
 4 {
 5 
 6 }
 7 
 8 dllTest::~dllTest()
 9 {
10 
11 }
12 
13 void dllTest::setStr(const QString& str)
14 {
15     m_str=str+"--------"+QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
16 }
17 QString dllTest::getStr()
18 {
19     return m_str;
20 }
DLLTest.cpp

7)OK,dll部分結束。

 

2.dll的調用部分:

按照正常的調用流程:1)鏈接器->輸入lib;2)附加包含目錄(直接將DLLTest.h包含即可);3)調用即可。

測試部分代碼:

 1 #ifndef MAINTEST_H
 2 #define MAINTEST_H
 3 
 4 #include <QtWidgets/QMainWindow>
 5 #include "ui_maintest.h"
 6 
 7 class mainTest : public QMainWindow
 8 {
 9     Q_OBJECT
10 
11 public:
12     mainTest(QWidget *parent = 0);
13     ~mainTest();
14 
15 private:
16     Ui::mainTestClass ui;
17 
18 private slots:
19     void GoClick();
20 };
21 
22 #endif // MAINTEST_H
mainTest.h
 1 #include "maintest.h"
 2 #include "dlltest.h"
 3 
 4 mainTest::mainTest(QWidget *parent)
 5     : QMainWindow(parent)
 6 {
 7     ui.setupUi(this);
 8 
 9     connect(ui.btnGo,SIGNAL(clicked()),this,SLOT(GoClick()));
10 }
11 
12 mainTest::~mainTest()
13 {
14 
15 }
16 
17 void mainTest::GoClick()
18 {
19     dllTest dt;
20     dt.setStr(ui.txtIn->toPlainText());
21 
22     ui.txtOut->setText(dt.getStr());
23 }
mainTest.cpp

效果圖:

 

-----The End

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM