QT动态加载DLL包括加载DLL中的类及其成员函数
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();
}
}
运⾏⼀下就可以了!
aaa