- 項目的一個需求是提供一個dll文件給其他 可執行文件調用。借這個機會也正好可以解決我之前一個在線升級使用更新dl方法l的思路。
在此記錄一下。各位大神如果有其他方法和思路歡迎一起探討或者賜教。。
dll 調用接口 :
- class IUIPLUGINBASE
- {
- public:
- //初始化 失敗返回-1
- // virtual int init() = 0;
- //input:顯示的起始位置x , y 軸座標
- virtual int show(int pos_x , int pos_y = 0) = 0;
- };
- Q_DECLARE_INTERFACE(IUIPLUGINBASE,"uiplugins/1.0") //這個宏用聲明接口
上面代碼定義其他程序調用的接口,在這個裏面使用一個show的虛函數。 至於virtual 虛函數,展開描述,估計夠一章內容的。此處不深探究。
dll 實現的頭文件:
- #include <QWidget>
- #include "iuipluginbase.h"
- class MainDlg : public QWidget,public IUIPLUGINBASE
- {
- Q_OBJECT
- Q_INTERFACES(IUIPLUGINBASE)
- public:
- explicit MainDlg(QWidget *parent = 0);
- ~MainDlg();
- //input:顯示的起始位置x , y 軸座標
- int show(int pos_x , int pos_y);
- private slots:
- private:
- };
dll實現類
- 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;
- }
- QT_BEGIN_NAMESPACE
- Q_EXPORT_PLUGIN2(MainDlg, MainDlg)
- QT_END_NAMESPACE
標紅的地方需要特別注意。
調用dll文件的地方加入代碼:
- 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文件。 這個功能還是非常重要的,非常適合多人開發或者在線更新,甚至插件式開發思路。
做個筆記。。有更好思路的大牛們歡迎留下您的建議。