经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
Qt插件热加载-QPluginLoader实现
来源:cnblogs  作者:朝十晚八  时间:2019/5/9 9:50:44  对本文有异议

上一篇C++消息框架-基于sigslot文章中我们讲述了使用sigslot信号槽实现自己的消息框架,这是一个比较粗糙,而且小的框架。当我们的程序逐渐变大时,我们可能就会考虑功能插件化,或者支持某些模块动态加载和卸载。

功能动态加载,也就是我们平时所说的插件化,插件支持热插拔。

之前工作中,刚好接触过这一块的内容。下面是一个Qt加载dll的方式,当我们把dll加载上以后,可以尝试转化为PluginInterface接口,如果可以转换成功,则说明我们这个dll是我们需要的插件,然后我们就可以进行插件初始化。

如果插件代码需要和主程序通信,我们只需要在初始化插件的时候把相关参数传递进去即可。

  1. void ReadPluginsInfo( const QString & pluginsDirPath /*= ""*/ )
  2. {
  3. QString pluginsPath = pluginsDirPath;
  4. if (pluginsDirPath.isEmpty())
  5. {
  6. pluginsPath = QApplication::applicationDirPath();
  7. }
  8. QDir pluginsDir(pluginsPath);
  9. pluginsDir.cd("Plugins");
  10. QFileInfoList pluginsFile = pluginsDir.entryInfoList(QStringList() << "*.dll", QDir::Files);
  11. foreach(QFileInfo fileInfo, pluginsFile)
  12. {
  13. QPluginLoader loader(fileInfo.absoluteFilePath());
  14. bool isLoad = loader.isLoaded();
  15. QString info = loader.errorString();
  16. if (QObject * plugin = loader.instance())
  17. {
  18. if (PluginInterface * pinterface = dynamic_cast<PluginInterface *>(plugin))
  19. {
  20. pinterface->install(PluginParam());//初始化插件
  21. m_lstPluginInterFace.push_back(pinterface);
  22. }
  23. }
  24. else
  25. {
  26. qDebug() << loader.errorString();
  27. }
  28. }
  29. }

上述代码伪代码如下:

  1. void ReadPluginsInfo( const QString & pluginsDirPath /*= ""*/ )
  2. {
  3. 进入插件路径
  4. 获取路径下所有dll
  5. foreach(dll集合)
  6. {
  7. 使用QPluginLoader加载动态库文件
  8. if (转化为插件接口类)
  9. {
  10. 初始化插件
  11. }
  12. }
  13. }

原文链接:http://www.cnblogs.com/swarmbees/p/10831111.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号