QT动态加载DLL包括加载DLL中的类及其成员函数

版权声明:本文为博主原创文章,未经同意不允许转载! https://blog.csdn.net/wb175208/article/details/86181626

QT中加载DLL的方式有两种:

一种是静态方式的加载,需要有两个文件:lib文件和dll文件。lib文件就是导入库,里面定义了一些函数符号,在调用的时候会直接查找这些函数符号,然后根据这些函数符号,找到DLL对应的模块加载进来进行调用。

另一种就是动态调用。在使用的时候才会加载dll进来,使用QT本身自己的加载机制,利用QLibrary进行动态加载。

静态加载的方式比较常用,下面介绍一下动态加载的方式:

1.首先创建一个dll项目,一定要选择Qt Class Library:

在这里插入图片描述

2.编写DLL程序

#pragma once

#include "mainfunc_global.h"
#include <string>

class MAINFUNC_EXPORT MainFunc {
public:
	MainFunc();

	virtual int add(int a,int b);
	virtual void printMsg(QString msg);
};

extern "C" {//一定要添加上
	MAINFUNC_EXPORT MainFunc* getDllObj();

	MAINFUNC_EXPORT char* text();

	MAINFUNC_EXPORT int printInt();
}

在需要导出的函数上一定要添加上extern “C”,编译器在生成DLL的时候,就会自动的按照C语言的编译方式进行编译,只会编译出函数名,而不会编译上参数类型。

#include "MainFunc.h"
#include <QMessageBox>

MainFunc::MainFunc() {
}

int MainFunc::add(int a, int b) {
	return a + b;
}

void MainFunc::printMsg(QString msg) {
	QMessageBox* msgBox = new QMessageBox;
	msgBox->setText(msg);
	msgBox->setWindowTitle(QStringLiteral("信息框"));
	msgBox->show();
}

MAINFUNC_EXPORT MainFunc* getDllObj() {
	return new MainFunc;
}

MAINFUNC_EXPORT char* text() {
	return "Hello World 2019!";
}

MAINFUNC_EXPORT int printInt() {
	return 2019;
}

编译一下就可以生成DLL和相应的LIB文件。

3.动态调用

声明函数指针:

#include <QMessageBox>
#include "../MainFunc/MainFunc.h"
#include <QLibrary>
#include <QDebug>

typedef MainFunc* (*getObj)();
typedef char* (*dllText)();
typedef int (*dllPrintInt)();

具体调用过程:

void QtVS2015::slotTest() {
	QLibrary* mainFunDll = new QLibrary("MainFunc.dll");
	if (mainFunDll->load()) {
		getObj obj = (getObj)mainFunDll->resolve("getDllObj");
		MainFunc* mF = obj();
		mF->printMsg(QStringLiteral("这是一个DLL调用程序"));
		qDebug()<<mF->add(4, 7);

		dllText dText = (dllText)mainFunDll->resolve("text");
		qDebug() << QString::fromLocal8Bit(dText());

		dllPrintInt dPrintInt = (dllPrintInt)mainFunDll->resolve("printInt");
		qDebug() << dPrintInt();

	} else {
		QMessageBox* msgBox = new QMessageBox;
		msgBox->setText(QStringLiteral("动态库加载失败!"));
		msgBox->setWindowTitle(QStringLiteral("信息框"));
		msgBox->show();
	}
}

运行一下就可以了!

猜你喜欢

转载自blog.csdn.net/wb175208/article/details/86181626
今日推荐