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)”所以我们将头文件改造成:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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)紧接着我们实现成员函数:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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)调用即可。
测试部分代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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