应用需求:
某些场景下我们可能面临这样的问题,在运行着的应用程序不能终止的情况下,升级某个功能(或添,或减,或修改)。在不采用CTK Plugin Framework插件系统架构的情况下这将是很困难的,我们需要停止运行程序,然后在相关代码中作出修改,然后再重新编译,再重新启动我们的程序。而如果是基于CTK Plugin Framework插件系统架构构建的系统,则很容易的实现插件的动态升级。在【大话Qt之四】ctkPlugin插件系统实现项目插件式开发中,我对ctkPlugin做了简单介绍,在次就不再重复。将主要精力放在,如何解决插件的动态升级。
实现思路:
ctkPlugin插件系统中,每个功能模块都是一个插件,而每个插件的开发都遵循一定的编写格式,其中:每个插件在定义时都会指定它的版本信息,并生成其最终对应的dll插件(Linux下为.so插件)对应一个版本信息,例如:com.lhtx.filetransfer_0.9.0.dll,并最终通过registerService注册到插件系统中提供服务,通过getServiceReference和getService来从插件系统中获取插件实例。
那么,插件更新触发的机制是什么呢?通常在项目中,都会存在一个单独的plugins的文件夹,下面放置的是所有我们需要使用到的插件,当系统启动时,会主动扫描该目录下的所有插件,并注册到系统中。因此,插件更新触发的时机就是该目录下的文件发生变化,例如:原本plugins目录下存在一个com.lhtx.filetransfer_0.9.0.dll的插件,它的版本信息是0.9.0,当我们将一个com.lhtx.filetransfer_0.9.1.dll的插件放进去,它的版本为0.9.1,就会触发版本升级的事件。要对plugins目录实现监控,使用QFileSystemWatcher完全可以满足我们的需求,只需要通过下面的代码:
//! 对插件目录执行监控,为的是插件版本升级时可以检测到新插件,从而实现插件热加载
m_pluginWatcher = new QFileSystemWatcher;
QString houqd = Parameters[LH_KEY_PLUGIN_PATH].toString();
m_pluginWatcher->addPath(Parameters[LH_KEY_PLUGIN_PATH].toS