QT、C++插件式框架、主要原理还是 动态库的动态加载、 dlopen()函数、下面为动态加载拿到Plugininstance对应指针、void**pp=(void**)dlsym(handle,"Plugininstance");

功能:添加单个插件
参数:libName:添加名为libName的插件
返回:成功返回true,失败返回false
*/
bool PluginManager::loadPlugin(const QString&libName)
{
void*handle=dlopen(libName.toLocal8Bit().data(),RTLD_LAZY); //打开动态库
if(handle==nullptr){
LOG(ERROR)<<"open "<<libName.toLocal8Bit().data()<<" error!:"<<dlerror();
return false;
}
void**pp=(void**)dlsym(handle,"Plugininstance");
if(pp==nullptr||*pp==nullptr){
LOG(ERROR)<<"get "<<libName.toLocal8Bit().data()<<" Instance error!";
return false;
}
PluginCore*pluginCore=static_cast<PluginCore*>(*pp);
if(pluginCore==nullptr){
LOG(ERROR)<<"add plugin error!:"<<libName.toLocal8Bit().data();
if(handle)dlclose(handle);
return false;
}
connect(pluginCore,SIGNAL(sendDataToBus(shared_ptr<PluginMessage>)),this,SLOT(notifyMessage(shared_ptr<PluginMessage>)));
if(plugins.contains(libName)){ //防止同一个库被打开两次
dlclose(plugins[libName].libHandle);
plugins.remove(libName);
}
plugins.insert(libName,std::move(PluginInfo(handle,pluginCore)));
qDebug()<<QString("add plugin:%1 succeed!").arg(libName);
return true;
}

以上是加载、下面是说说智能指针管理内存shared_ptr<PluginMessage>智能指针 管理Pluginmessage 插件集成这个类、去重写类方法

class PLUGINCORESHARED_EXPORT PluginCore:public QObject
{
Q_OBJECT
friend class PluginManager;
protected:
PluginCore();
protected slots:
virtual void init(void);
virtual void onBusReadyRead(shared_ptr<PluginMessage>);
virtual bool isValidMessage(PluginMessage::PluginMessageType type);

protected:
std::unique_ptr<QThread,void(*)(QThread*)> thread;

signals:
void busReadyRead(shared_ptr<PluginMessage>);
void sendDataToBus(shared_ptr<PluginMessage>);
private:
void onValidBUsData(shared_ptr<PluginMessage> data);
};

*********************************智能指针传递的消息类型**********************************************

class PluginMessage
{
public:
enum PluginMessageType{// 枚举消息类型
BSMFrame,
SpatFrame,
RsiFrame,
RsmFrame,
MapFrame,
SystemGlobal,
gnssData,
CanFrame,
OBUTOAPP,
VERSION,
UPGRADE_STATUS,
OTAMESSAGE,
BSMSENDER,
STARUPDATE,
ENDUPDATA,
};

public:
explicit PluginMessage(const char* messageData, int messageSize, PluginMessageType type);
~PluginMessage();
PluginMessage()=default;
PluginMessage(const PluginMessage&)=default;
PluginMessage(PluginMessage&&)noexcept=default;
PluginMessage&operator=(const PluginMessage&)=default;
PluginMessage&operator=(PluginMessage&&)noexcept=default;

public:
int m_messageSize;
const char* m_messageData = NULL;
PluginMessageType m_messageType;
};

注意: qRegisterMetaType<PluginMessage>("PluginMessage"); 。。。。。。。。。。//后面还有自己该注册啥就注册啥

要注册Qt消息类型才可以使用信号槽哦

QT/C++插件式框架、利用智能指针管理内存空间的实现、动态加载动态库文件的更多相关文章

  1. 动态加载框架DL分析

    动态加载框架DL分析 插件化开发,主要解决三个问题1.动态加载未安装的apk,dex,jar等文件2.activity生命周期的问题,还有service3.Android的资源调用的问题 简单说一下怎 ...

  2. Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库     本文地址:https ...

  3. 基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  4. 【插件式框架探索系列】应用程序域(AppDomain)

    应用程序域(AppDomain)已经不是一个新名词了,只要熟悉.net的都知道它的存在,不过我们还是先一起来重新认识下应用程序域吧,究竟它是何方神圣. 应用程序域 众所周知,进程是代码执行和资源分配的 ...

  5. 携程Android App的插件化和动态加载框架

    携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...

  6. C++智能指针管理类

    1.程序员明确的进行内存释放 对于c++程序员,最头脑的莫过于对动态分配的内存进行管理了.c++在堆上分配的内存,需要程序员负责对分配的内存进行释放.但有时内存的释放看起来并不件很轻松的事,如下程序 ...

  7. 从零开始实现ASP.NET Core MVC的插件式开发(一) - 使用ApplicationPart动态加载控制器和视图

    标题:从零开始实现ASP.NET Core MVC的插件式开发(一) - 使用Application Part动态加载控制器和视图 作者:Lamond Lu 地址:http://www.cnblogs ...

  8. 携程Android App插件化和动态加载实践

    携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...

  9. Android动态加载框架汇总

    几种动态加载的比较 1.Tinker 用途:热修复 GitHub地址:https://github.com/Tencent/tinker/ 使用:http://www.jianshu.com/p/f6 ...

随机推荐

  1. Catalina 动态壁纸相关设置

    关闭SIP 重启,在开机时一直按Command+r进入recovery模式. 打开终端,如图所示: 在终端中输入命令,回车: csrutil disable 然后重启 设置动态壁纸 首先需在Dynam ...

  2. Shell编程(3)

    1. shell流程控制 2. for语句 3. while语句 4. break和continue语句 5. case语句 6. shell编程高级实战 shell流程控制 流程控制是改变程序运行顺 ...

  3. python实例文本进度条

    简单的文本进度条代码 解析 引入time库 打印一行作为开始 最后也打印一个结束的标签 定义变量等于10,文本进度条大概的宽度是10 使用for循环来模拟进度,for i in range()能够不断 ...

  4. 对比ERP解读企业资产管理EAM在电力行业应用

    对比ERP解读企业资产管理EAM在电力行业应用 .关于EAMEAM (Enterprise Asset Management)企业资产管理,是面向固定资产占企业资产主要部分的资产密集型(Capital ...

  5. kmt字符串匹配

    # -*- coding:utf-8 -*-class StringPattern: def findAppearance(self, A, lena, B, lenb): pos=0 tmp = 0 ...

  6. 7种jvm垃圾回收器,这次全部搞懂

    前言 之前我们讲解了jvm的组成结构与垃圾回收算法等知识点,今天我们来讲讲jvm最重要的堆内存是如何使用垃圾回收器进行垃圾回收,并且如何使用命令去配置使用这些垃圾回收器. 堆内存详解 上面这个图大家应 ...

  7. 破晓行动----带你总结JVM的知识大全(二)

    JVM运行时内存 + 垃圾回收与算法

  8. C# 中的 is 真的是越来越强大,越来越语义化

    一:背景 1. 讲故事 最近发现 C#7 之后的 is 是越来越看不懂了,乍一看花里胡哨的,不过当我静下心来仔细研读,发现这 is 是越来越短小精悍,而且还特别语义化,那怎是一个爽字了得,这一篇就和大 ...

  9. linux_命令格式和命令提示符

    # linux 中一切皆文件 命令格式: 命令 [功能选项] [文件路径] cmd [options] [path] # 多个功能选项,要放在一起,如 rsync -avz /backup backu ...

  10. 腾讯云Elasticsearch集群规划及性能优化实践

    ​一.引言 随着腾讯云 Elasticsearch 云产品功能越来越丰富,ES 用户越来越多,云上的集群规模也越来越大.我们在日常运维工作中也经常会遇到一些由于前期集群规划不到位,导致后期业务增长集群 ...