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


  1. 项目的一个需求是提供一个dll文件给其他 可执行文件调用。借这个机会也正好可以解决我之前一个在线升级使用更新dl方法l的思路。

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



dll 调用接口 :

  1. class IUIPLUGINBASE  
  2. {  
  3. public:  
  4.     //初始化 失败返回-1  
  5. //    virtual int init() = 0;  
  6.     //input:显示的起始位置x , y 轴座标  
  7.     virtual int show(int pos_x , int pos_y = 0) = 0;  
  8.   
  9. };  
  10. Q_DECLARE_INTERFACE(IUIPLUGINBASE,"uiplugins/1.0"//这个宏用声明接口

上面代码定义其他程序调用的接口,在这个里面使用一个show的虚函数。 至于virtual  虚函数,展开描述,估计够一章内容的。此处不深探究。


dll 实现的头文件:

  1. #include <QWidget>  
  2. #include "iuipluginbase.h"  
  3. class MainDlg : public QWidget,public IUIPLUGINBASE  
  4. {  
  5.     Q_OBJECT  
  6.     Q_INTERFACES(IUIPLUGINBASE)


  1. public:  
  2.     explicit MainDlg(QWidget *parent = 0);  
  3.     ~MainDlg();  
  4.     //input:显示的起始位置x , y 轴座标  
  5.     int show(int pos_x , int pos_y);  
  6. private slots:  
  7.   
  8. private:  
  9.   
  10. };  

dll实现类
  1. MainDlg::MainDlg(QWidget *parent) :  
  2.     QWidget(parent),  
  3.     ui(new Ui::MainDlg)  
  4. {  
  5.      
  6. }  
  7.   
  8. int MainDlg::show(int pos_x, int pos_y)  
  9. {  
  10.     move(pos_x,pos_y);  
  11.     QWidget::show();  
  12.     return 1;  
  13. }  
  14.   
  15. QT_BEGIN_NAMESPACE  
  16. Q_EXPORT_PLUGIN2(MainDlg, MainDlg)  
  17. QT_END_NAMESPACE

标红的地方需要特别注意。



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

  1. QPluginLoader loader("uiplugins.dll");  
  2. IUIPLUGINBASE * P_plug;  
  3. QObject*  loaderplugin= loader.instance();  
  4. if(!loader.isLoaded())  
  5.     qDebug() << loader.errorString();  
  6. if (loaderplugin) {  
  7.     P_plug = qobject_cast<IUIPLUGINBASE * >(loaderplugin);  
  8.   
  9.     P_plug->show(100,100);  
  10. }  


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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章