上一篇C++消息框架-基于sigslot文章中咱们讲述了使用sigslot信号槽实现本身的消息框架,这是一个比较粗糙,并且小的框架。当咱们的程序逐渐变大时,咱们可能就会考虑功能插件化,或者支持某些模块动态加载和卸载。app
功能动态加载,也就是咱们平时所说的插件化,插件支持热插拔。框架
以前工做中,恰好接触过这一块的内容。下面是一个Qt加载dll的方式,当咱们把dll加载上之后,能够尝试转化为PluginInterface接口,若是能够转换成功,则说明咱们这个dll是咱们须要的插件,而后咱们就能够进行插件初始化。插件
若是插件代码须要和主程序通讯,咱们只须要在初始化插件的时候把相关参数传递进去便可。code
void ReadPluginsInfo( const QString & pluginsDirPath /*= ""*/ ) { QString pluginsPath = pluginsDirPath; if (pluginsDirPath.isEmpty()) { pluginsPath = QApplication::applicationDirPath(); } QDir pluginsDir(pluginsPath); pluginsDir.cd("Plugins"); QFileInfoList pluginsFile = pluginsDir.entryInfoList(QStringList() << "*.dll", QDir::Files); foreach(QFileInfo fileInfo, pluginsFile) { QPluginLoader loader(fileInfo.absoluteFilePath()); bool isLoad = loader.isLoaded(); QString info = loader.errorString(); if (QObject * plugin = loader.instance()) { if (PluginInterface * pinterface = dynamic_cast<PluginInterface *>(plugin)) { pinterface->install(PluginParam());//初始化插件 m_lstPluginInterFace.push_back(pinterface); } } else { qDebug() << loader.errorString(); } } }
上述代码伪代码以下:接口
void ReadPluginsInfo( const QString & pluginsDirPath /*= ""*/ ) { 进入插件路径 获取路径下全部dll foreach(dll集合) { 使用QPluginLoader加载动态库文件 if (转化为插件接口类) { 初始化插件 } } }