Qt 使用QPluginLoader 加载外部dll的方法笔记

xiaoxiao2021-02-28  113

[cpp] view plain copy <span style="font-family:Arial,Helvetica,sans-serif; background-color:rgb(255,255,255)">项目的一个需求是提供一个dll文件给其他 可执行文件调用。借这个机会也正好可以解决我之前一个在线升级使用更新dl方法l的思路。</span>  

在此记录一下。各位大神如果有其他方法和思路欢迎一起探讨或者赐教。。

dll 调用接口 :

[cpp] view plain copy class IUIPLUGINBASE  {  public:      //初始化 失败返回-1  //    virtual int init() = 0;      //input:显示的起始位置x , y 轴坐标      virtual int show(int pos_x , int pos_y = 0) = 0;    };  <span style="background-color:rgb(255,102,102)">Q_DECLARE_INTERFACE(IUIPLUGINBASE,"uiplugins/1.0"//这个宏用声明接口</span>   上面代码定义其他程序调用的接口,在这个里面使用一个show的虚函数。 至于virtual  虚函数,展开描述,估计够一章内容的。此处不深探究。

dll 实现的头文件:

[cpp] view plain copy #include <QWidget>  #include "iuipluginbase.h"  class MainDlg : public QWidget,public IUIPLUGINBASE  {      Q_OBJECT     <span style="background-color:rgb(255,102,102)"> Q_INTERFACES(IUIPLUGINBASE)</span>  public:      explicit MainDlg(QWidget *parent = 0);      ~MainDlg();      //input:显示的起始位置x , y 轴坐标      int show(int pos_x , int pos_y);  private slots:    private:    };   dll实现类 [cpp] view plain copy MainDlg::MainDlg(QWidget *parent) :      QWidget(parent),      ui(new Ui::MainDlg)  {       }    int MainDlg::show(int pos_x, int pos_y)  {      move(pos_x,pos_y);      QWidget::show();      return 1;  }    <span style="background-color:rgb(255,102,102)">QT_BEGIN_NAMESPACE  Q_EXPORT_PLUGIN2(MainDlg, MainDlg)  QT_END_NAMESPACE</span>   标红的地方需要特别注意。

调用dll文件的地方加入代码:

[cpp] view plain copy QPluginLoader loader("uiplugins.dll");  IUIPLUGINBASE * P_plug;  QObject*  loaderplugin= loader.instance();  if(!loader.isLoaded())      qDebug() << loader.errorString();  if (loaderplugin) {      P_plug = qobject_cast<IUIPLUGINBASE * >(loaderplugin);        P_plug->show(100,100);  }  

通过上诉代码段,即可实现外部程序调用dll文件。 这个功能还是非常重要的,非常适合多人开发或者在线更新,甚至插件式开发思路。

做个笔记。。有更好思路的大牛们欢迎留下您的建议。

转载请注明原文地址: https://www.6miu.com/read-33535.html

最新回复(0)