QT/C++插件式框架、利用智能指针管理内存空间的实现、动态加载动态库文件
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++插件式框架、利用智能指针管理内存空间的实现、动态加载动态库文件的更多相关文章
- 动态加载框架DL分析
动态加载框架DL分析 插件化开发,主要解决三个问题1.动态加载未安装的apk,dex,jar等文件2.activity生命周期的问题,还有service3.Android的资源调用的问题 简单说一下怎 ...
- Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt动态连接库/静态连接库创建与使用,QLibrary动态加载库 本文地址:https ...
- 基于C/S架构的3D对战网络游戏C++框架_05搭建系统开发环境与Boost智能指针、内存池初步了解
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- 【插件式框架探索系列】应用程序域(AppDomain)
应用程序域(AppDomain)已经不是一个新名词了,只要熟悉.net的都知道它的存在,不过我们还是先一起来重新认识下应用程序域吧,究竟它是何方神圣. 应用程序域 众所周知,进程是代码执行和资源分配的 ...
- 携程Android App的插件化和动态加载框架
携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...
- C++智能指针管理类
1.程序员明确的进行内存释放 对于c++程序员,最头脑的莫过于对动态分配的内存进行管理了.c++在堆上分配的内存,需要程序员负责对分配的内存进行释放.但有时内存的释放看起来并不件很轻松的事,如下程序 ...
- 从零开始实现ASP.NET Core MVC的插件式开发(一) - 使用ApplicationPart动态加载控制器和视图
标题:从零开始实现ASP.NET Core MVC的插件式开发(一) - 使用Application Part动态加载控制器和视图 作者:Lamond Lu 地址:http://www.cnblogs ...
- 携程Android App插件化和动态加载实践
携程Android App的插件化和动态加载框架已上线半年,经历了初期的探索和持续的打磨优化,新框架和工程配置经受住了生产实践的考验.本文将详细介绍Android平台插件式开发和动态加载技术的原理和实 ...
- Android动态加载框架汇总
几种动态加载的比较 1.Tinker 用途:热修复 GitHub地址:https://github.com/Tencent/tinker/ 使用:http://www.jianshu.com/p/f6 ...
随机推荐
- 本周 GitHub 速览:自动化当道,破密、爬虫各凭本事
作者:HelloGitHub-小鱼干 摘要:安全门外汉,如何在不知道密钥或密码的情况下,破解哈希得到原文,Ciphey 会告诉你当中的密码.说到 auto 智能爬虫会基于上一次的爬虫经历进一步学习以获 ...
- (专题一)04 matlab矩阵表示
矩阵的建立 1. 直接输入法建立矩阵, 建立一个三行三列的矩阵 >>A=[1,2,3;4,5,6;7,8,9] 建立一个三行两列的矩阵 >>B=[1,2;4,5;7,8] 2. ...
- google protocol buffer——protobuf的问题和改进2
这一系列文章主要是对protocol buffer这种编码格式的使用方式.特点.使用技巧进行说明,并在原生protobuf的基础上进行扩展和优化,使得它能更好地为我们服务. 在上一篇文章中,我们举例了 ...
- springmvc 源码分析(一)-- DisparcherServlet的创建和注册到tomcat
一. servlet 3.0 的使用 1.1 环境搭建: servlet跟spring没有任何关系,我创建一个servlet可以不依赖spring,现在搭建一个纯的servlet项目,并实现简单的类似 ...
- 学习Maven有感
1.maven的由来 maven是一款服务于java平台的自动化构建工具 构建定义:把动态的Web工程经过编译得到的编译结果部署到服务器上的整个过程. 编译:java源文件[.java]->编译 ...
- application x-www-form-urlencoded与JS的encodeURIComponent()
application/x-www-form-urlencoded 表单的enctype属性表示在发送到服务器之前应该如何对表单数据进行编码,默认值是application/x-www-form-ur ...
- (转载)CPU基础知识
本文转载自网络. 如有侵权,请联系处理! 简介 中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心( Con ...
- 坐标下降(Coordinate descent)
坐标下降法属于一种非梯度优化的方法,它在每步迭代中沿一个坐标的方向进行线性搜索(线性搜索是不需要求导数的),通过循环使用不同的坐标方法来达到目标函数的局部极小值.
- 在KEIL下查看单片机编程内存使用情况
原文链接:https://blog.csdn.net/D_azzle/article/details/83410141 截至到目前为止,本人接触单片机也有将近一年的时间.这一年以来也接触过了很具代表性 ...
- visual studio 2015 Opencv4.0.1配置
最近由于工作需要,要配置opencv,我的电脑vs的version是2015,在网上下载了最新的opencv 4.0.1 自己摸索总是很困难,网上的例子也比较多,但版本比较低,也不确定适不适合vs20 ...