最近在做QT相关的项目,需要用到DLL,看了下网上的有关QT创建DLL的教程,大多数都是在QT Creator里面的。基于Visual Studio的非常少,这里就记录下自己走过的那些坑。
准备工作.在VS2015里面创建DLL项目以及调用DLL的GUI(方便自测试,图中的DllTest就是目标Dll文件,UIDll就是为了测试它的GUI)
关于DLL的调用,我从网上找到如下几种方法,第二种方法和第一种类似,我就没有验证了。
先讲一下对QT动态链接库的调用方法,主要包括:
1、显式链接DLL,调用DLL的全局函数,采用Qt的QLibrary方法
2、显示链接DLL,调用DLL中类对象、成员函数。(通过对象即可实现类成员函数的调用)
①用虚函数表的方法,这也是COM使用的方法,利用Qt的QLibrary技术调用;
②用GetProcAddress直接调用。
③用Qt的QPluginLoader类直接调用生成的DLL插件类对象
3、隐式链接DLL:也是采用Qt的Qlibrary方法
方法一
1.在DllTest.h里面如下编写
#pragma once
#include "dlltest_global.h"
class DLLTEST_EXPORT DllTest
{
public:
DllTest();
};
//extern "C"为了声明属于C的函数
extern "C" DLLTEST_EXPORT int getVersion();
2.在DllTest.cpp里面实现此方法
#include "DllTest.h"
#include <QDebug>
DllTest::DllTest()
{
qDebug() << "";
}
int getVersion()
{
return 100;
}
3.然后切还到UIDll的工程里面,在UIDll里面的main.cpp里面实现调用的过程(先可以不考虑备注掉的内容,那是第二种方法用到的内容)
#include "UIDll.h"
#include <QtWidgets/QApplication>
#include <QLibrary>
#include <QDebug>
//#include "../DllTest/DllTest.h"
总结:方法一我折腾比较久的就是DllTest里面的函数定义,因为类型错误折腾了很久。按照以上代码是可以成功的。此方法缺点是调用函数的时候写的代码会比较多。
方法二(隐式链接DLL):
1.DllTest里面的写法没有变化。
2.main.cpp的内容只有少许变化,但是以下几步非常重要
①include DllTest.h文件
#include "../DllTest/DllTest.h" //此处是最重要的,一些基于QT Creator的教程都教你去写资源文件,在VS2015里面此处直接include就可以
②附加目录里面添加DllTest.lib的路径
③输入里面添加DllTest.lib的名称
#include "UIDll.h"
#include <QtWidgets/QApplication>
#include <QLibrary>
#include <QDebug>
#include "../DllTest/DllTest.h" //此处是最重要的,一些基于QT Creator的教程都教你去写资源文件,在VS2015里面此处直接include就可以
typedef int(*FUN)();
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
int result = getVersion();//隐式调用其实只有这一句话,你就可以调用DllTest里面的函数了
/*
QLibrary lib("DllTest.dll");
if (lib.load())
{
qDebug() << "load ok!";
FUN getVer = (FUN)lib.resolve("getVersion");
if (getVer)
{
qDebug() << "load gerVersion ok!";
int a = getVer();
}
else
{
qDebug() << "load error!!";
}
}
//*/
UIDll w;
w.show();
return a.exec();
}
以下是执行成功的截图
总结:这种方法在使用的时候非常方便,适用于函数比较多的时候,只需要把.lib和头文件,dll文件三者包含进来,操作非常简单。
如果有问题欢迎添加微信公众号 程序猿从入门到放弃 进行咨询: