zoukankan      html  css  js  c++  java
  • Qt中动态链接库的使用

    转自: http://www.qtcn.org/bbs/read.php?tid=14719
    现在有些软件有自动升级功能,有些就是下载新的DLL文件,替换原来的动态链接库.
    MFC好象也有类似机制

    Qt还有一种方式,就是把一个QWidget子类,编译成动态链接库.然后根据动态链接库创建一个对象,返回QWidget子针,如果你的类不是QWidget的子类,就不能用这种方法了

    QLibrary也是用来加载动态链接库,但它创建出来返回的是某个"方法的指针"(不需要头文件),而QPluginLoader创建返回的是"对象的指针"(对象中有哪些方法可调用,就要头文件说了,所以上面的例子中,需要提供一个接口头文件)
    ****************************************************************************************************************************************************************
    昨天一个同事说要把一个类做成DLL的形式,但这个类不是从QWidget继承。 研究了一下,发现Qt提供了一个类QPluginLoader可以加载动态链接库。能把一个普通的类编译生成DLL,通过QPluginLoader使用它。

    写一个例子说明吧:
    工程A中,使用了这样一个类,专门用来让算所得税;
    Tax.h
    class  Tax
    {
      float incomeTax(int income);
    };

    Tax.cpp
    Tax::incomeTax(int income)
    {
    float res=(income-1600)*0.5;
    return res;
    }

    main.cpp
    Int main()
    {
    Tax taxobject;
    taxObject. incomeTax(2200);
    ............
    }
    编译后部署到机器上.

    如果计税方式变了,则incomeTax()必须改写了;
    Tax::incomeTax(int income)
    {
    float res=(income-2000)*0.3;
    return res;
    }


    头文件没有变,只是修改了计税方式,工程A必须重新编译,然后重新部署; 如果工程A很大或部署的机器很多,代价就大了.
    如果让Tax类,单独编译成动态链接库,再把Tax中的要被使用的接口写在另一个头文件中,供工程A使用;每次计税方式变了,只需修改Tax类,然后重新编译生成动态链接库,然后替换工程A中的相应的动态链接库.而工程A不用重新编译即可使用新的计税方式.

    新建一工程B,专门用来把Tax类做成动态连接库的形式:

    //首先定义接口(只要一个头文件即可)
    Tax.h
    class Tax
    {
        virtual float incomeTax(int income);
    };
    QT_BEGIN_NAMESPACE
    Q_DECLARE_INTERFACE(Tax,"TaxDLL/1.0");  //这个宏用声明接口
    QT_END_NAMESPACE


    然后从写一个具体业务类,继承上面的接口和QObject,实现接口中定义的方法
    TaxPlugin.h
    class  TaxPlugin:public QObject,Tax
    {
        Q_OBJECT
        Q_INTERFACES(Tax)          
    public:
      float incomeTax(int income);
    };

    TaxPlugin.cpp
    TaxPlugin::incomeTax(int income)
    {
    float res=(income-1600)*0.5;
    return res;
    }
    Q_EXPORT_PLUGIN2(Tax, TaxPlugin);    //这个宏用来导出动态链接库

    编译工程B,生成Tax.dll.


    把工程Tax.dll和头文件Tax.h,拷到工程A中,供工程A使用.
    工程A中
    int main()
    {
    Tax *taxObject;
    QPluginLoader pluginLoader("Tax.dll");
    QObject *plugin = pluginLoader.instance();
    taxObject= qobject_cast<Tax *>(plugin);
    taxObject->incomeTax(2100);
    }
    如果税率变了,只要修改工程B中的类,然后重新编译生成Tax.dll,替换工程A中原来的库.而工程A不必重新编译即可使用新的计税方式.

    ****************************************************************************************************************************************************************
    现在有些软件有自动升级功能,有些就是下载新的DLL文件,替换原来的动态链接库.
    MFC好象也有类似机制

    Qt还有一种方式,就是把一个QWidget子类,编译成动态链接库.然后根据动态链接库创建一个对象,返回QWidget子针,如果你的类不是QWidget的子类,就不能用这种方法了

    QLibrary也是用来加载动态链接库,但它创建出来返回的是某个"方法的指针"(不需要头文件),而QPluginLoader创建返回的是"对象的指针"(对象中有哪些方法可调用,就要头文件说了,所以上面的例子中,需要提供一个接口头文件)
     
    http://blog.csdn.net/mociml/article/details/5626189
  • 相关阅读:
    在非MFC的win 32程序里面能够使用CString类
    一 VC2008环境中ICE的配置
    二 示例程序一
    三 ICE开发初级研究
    VC断点不可用的问题
    Ice笔记-利用Ice::Application类简化Ice应用
    GetCurrentDirectory、SetCurrentDirectory和GetModuleFileName
    Xcopy参数介绍
    COM组件开发实践(八)---多线程ActiveX控件和自动调整ActiveX控件大小(下)
    JackSon fasterxml学习
  • 原文地址:https://www.cnblogs.com/findumars/p/6375837.html
Copyright © 2011-2022 走看看