上一篇博客记录了纯虚函数动态库的封装,这篇博客记录一下Qt中加载动态库的方法,具体代码如下:
common.h和ibaseclass.h跟上一篇博客一样,这里就不写了,拷贝到工程目录下,然后将他们添加–》现有项,添加进来就可以了
test.ui只是一个继承QMainWindow的子类
test.h
#ifndef TEST_H
#define TEST_H
#include <QMainWindow>
#include <QWidget>
#include "ui_test.h"
#include "ibaseclass.h"
#include <QLibrary>
typedef void *(*createWidget)(QWidget *); //声明createInfoWidget函数指针
typedef IBaseClass *(*getWidget)(void *); //声明getInfoWidget函数指针
typedef void (*destroyWidget)(void *); //声明destroyInfoWidget函数指针
class Test : public QMainWindow
{
Q_OBJECT
public:
Test(QWidget *parent = 0);
~Test();
private:
Ui::Test ui;
createWidget m_FunCreateInfoWidget; //定义createInfoWidget函数指针
getWidget m_FunGetInfoWidget; //定义getInfoWidget函数指针
destroyWidget m_FunDestroyInfoWidget; //定义destroyInfoWidget函数指针
void *m_pVoidInfo; //接收createInfoWidget的返回值
IBaseClass *m_pIBaseClass; //接收getInfoWidget的返回值
QLibrary *m_pLibrary;
};
#endif // TEST_H
test.cpp
#include "test.h"
#include "common.h"
Test::Test(QWidget *parent)
: QMainWindow(parent)
, m_pLibrary(NULL)
{
ui.setupUi(this);
bool bflag = false;
m_pLibrary = new QLibrary("MyDll.dll");
if (!m_pLibrary->isLoaded())
{
bflag = m_pLibrary->load();
if (bflag)
{
m_FunCreateInfoWidget = (createWidget)m_pLibrary->resolve("createInfoWidget"); //通过函数名createInfoWidget来查找函数
m_FunGetInfoWidget = (getWidget)m_pLibrary->resolve("getInfoWidget");
m_FunDestroyInfoWidget = (destroyWidget)m_pLibrary->resolve("destroyInfoWidget");
}
}
if (m_FunCreateInfoWidget)
{
m_pVoidInfo = m_FunCreateInfoWidget(this);
m_pIBaseClass = m_FunGetInfoWidget(m_pVoidInfo);
if (m_pIBaseClass)
{
QList<Student> qlist;
Student s;
s.strClass = "grade 6";
s.strName = "zhangsan";
s.strSex = "man";
s.strNo = "37";
qlist.push_back(s);
m_pIBaseClass->LoadStudentInfo(qlist); //调用虚基类接口,显示学生信息
}
}
}
Test::~Test()
{
}
运行结果:
源码:
https://github.com/BlairHao/MyTest