Qt软件开发文档2---QT构建dll库,并使用dllmanager管理dll库

1.QT创建新项目

这里写图片描述
以treeViewDll为例
文件中含有treeviewdll_global.h
这里写图片描述

在treeview.cpp 中正常写入需要的内容
treeViewDll中声明在manager中调用的function
dll.h

#ifndef TREEVIEWDLL_H
#define TREEVIEWDLL_H

#include "treeviewdll_global.h"
#include <QWidget>
class TREEVIEWDLLSHARED_EXPORT TreeViewDll
{

public:
    TreeViewDll();
};

extern "C" Q_DECL_EXPORT bool showTree(void *,void *,void *);
#endif // TREEVIEWDLL_H

dll.cpp

#include "treeviewdll.h"
#include "treeview.h"

struct valTrans
{
    void *ptr;
};

TreeViewDll::TreeViewDll()
{

}

bool showTree(void *parent, void *tree, void *)
{
    QWidget *par = (QWidget *)parent;
    valTrans *vt = (valTrans *)tree;
    TreeView *treeview = new TreeView(par);
    QWidget *treewidget = (QWidget *) treeview;
    vt->ptr = treewidget;
    return true;
}

2.treeViewDll中加入CMakeLists(见1)

3.DllManager中调用treeViewDll

编译CmakeLists;
生成的DllManager为动态库
这里写图片描述
dllmanager.h

#ifndef DLLMANAGER_H
#define DLLMANAGER_H

#include "dllmanager_global.h"


#include <QMap>
#include <QLibrary>
//声明func函数   用于调用各种dll的function 注意函数类型 参数声明相同
//用void* 便于统一接口  各类型声明可以转换
typedef bool (*func)(void *, void *, void *);
class DLLMANAGERSHARED_EXPORT DllManager
{

public:
    DllManager();
    ~DllManager();
    QMap<QString, func> mapFunc;
    QMap<QString,QString> mapDll;
};

//extern "C" Q_DECL_EXPORT void runFunc(QString DllName, QString funName, void *a, void *b,void *c);
extern "C" Q_DECL_EXPORT bool runFunc(QString ,QString , void *a, void *b,void *c);

#endif // DLLMANAGER_H

dllmanager.cpp

#include <QLibrary>
#include "dllmanager.h"
#include <QDebug>
struct ValTrans
{
    void *ptr;
};
///
/// \brief DllManager::DllManager
///  find all functions with pointer
/// run those function while other call, return value;
/// run function without in the map, message warning.
///
DllManager::DllManager()
{
    func open;
    open = (func)QLibrary::resolve("splitterDll.dll","showSplitter");
    if(open){
        mapDll.insert("splitterDll.dll","showSplitter");//mapDll用于判断Dll中的函数是否存在
        mapFunc.insert("showSplitter",open);//mapFunc用于打开Dll中的函数
    }
    ////////////////////////////////////////////////
    //有瑕疵,可用QMap<QString,QMap> 嵌套关系 更为方便 //
    //也可以定义一个sturct{} 使用list存储遍历         //
    //避免一个dll中的多个函数调用BUG                  //
    ////////////////////////////////////////////////

    open = (func)QLibrary::resolve("treeDll.dll", "showTree");
    if (open){
        mapDll.insert("treeDll.dll","showTree");
        mapFunc.insert("showTree", open);
    }

    open = (func)QLibrary::resolve("btn_infoDll.dll", "showBtn_Info");
    if(open){
        mapDll.insert("btn_infoDll.dll", "showBtn_Info");
        mapFunc.insert("showBtn_Info", open);
    }

    open = (func)QLibrary::resolve("tabDll.dll", "showTab");
    if(open){
        mapDll.insert("tabDll.dll", "showTab");
        mapFunc.insert("showTab", open);
    }
}
DllManager::~DllManager()
{

}

bool runFunc(QString dllName,QString funName, void *a, void *b,void *c)
{
    DllManager manager;
    QMap<QString,QString> mapDll = manager.mapDll;
    //判断dll中是否含有function
    if(mapDll.value(dllName) == funName){
        QMap<QString, func> mapFunc = manager.mapFunc;
            if(mapFunc.value(funName)){
                //调用function
                func fOpen = mapFunc.value(funName);
                fOpen(a, b, c);
                return true;
            }else{
                qDebug()<<"function is not exit";
                return false;
            }
    }else{
        qDebug()<<"dll function is not exit";
        return false;
    }
}

至此 利用dllmanager 管理dll完成
Tip:: 可利用 dependency worker 来检测dll函数是否保存成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值