QT动态加载DLL包括加载DLL中的类及其成员函数
QT中加载DLL的方式有两种:一种是静态方式的加载,需要有两个文件:lib文件和dll文件。lib文件就是导入库,里面定义了一些函数符号,在调用的时候会直接查找这些函数符号,然后根据这些函数符号,找到DLL对应的模块加载进来进行调用。另一种就是动态调用。在使用的时候才会加载dll进来,使用QT本身自己的加载机制,利用QLibrary进行动态加载。静态加载的方式比较常用,下面介绍一下动态加载的...
·
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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献5条内容
所有评论(0)