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函数是否保存成功。