利用QT5.9创建并调用DLL(基于Visual Studio 2015)

最近在做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" 

typedef int(*FUN)();//此处定义函数指针
int main(int argc, char *argv[]){QApplication a(argc, argv);//int result = getVersion();QLibrary lib("DllTest.dll");//此处就是DLL的位置,需要将Dll放在UIDll.exe的根目录,我的路径是..\DllTest\Win32\Debugif (lib.load()){qDebug() << "load ok!";FUN getVer = (FUN)lib.resolve("getVersion");if (getVer)//刚开始我写的DLL函数老是load error,原因就是在DLLTest里面没有用extern "C"用了C函数也需要和它匹配{qDebug() << "load gerVersion ok!";int a = getVer();}else{qDebug() << "load error!!";}}//*/UIDll w;w.show();return a.exec();}

总结:方法一我折腾比较久的就是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文件三者包含进来,操作非常简单。

如果有问题欢迎添加微信公众号 程序猿从入门到放弃 进行咨询:


  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值