首先,不得不承認的是,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
注意:由於頭文件中沒有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 }
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
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 }
效果圖:

-----The End
