VS-Qt环境下dll

Posted 憩园小酌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于VS-Qt环境下dll的主要内容,如果未能解决你的问题,请参考以下文章

.dll文件有啥用?

c++中的纯虚函数机制如何从DLL中暴露函数

恶意代码分析实战——Lab03-02.dll分析篇

vs2010下静态加载dll文件,每次都要把.dll .lib 复制到目录下,但书上说可以设置系统环境变量就不要复制

c#(winform)环境下使用动态链接库dll的详解

C#引入QT5环境下生成的DLL用不了,报错是无法加载 找不到指定模块