• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            逛奔的蝸牛

            我不聰明,但我會很努力

               ::  :: 新隨筆 ::  ::  :: 管理 ::
            轉自: 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創建返回的是"對象的指針"(對象中有哪些方法可調用,就要頭文件說了,所以上面的例子中,需要提供一個接口頭文件)
            posted on 2009-08-29 09:43 逛奔的蝸牛 閱讀(4665) 評論(1)  編輯 收藏 引用 所屬分類: Qt

            評論

            # re: Qt: Qt中動態鏈接庫的使用 2009-08-29 10:18 暗金裝備
            QLibrary也是用來加載動態鏈接庫,但它創建出來返回的是某個"方法的指針"(不需要頭文件),而QPluginLoader創建返回的是"對象的指針"(對象中有哪些方法可調用,就要頭文件說了,所以上面的例子中,需要提供一個接口頭文件)  回復  更多評論
              

            国产精品美女久久久m| 国产精品成人精品久久久| 久久久久久精品免费免费自慰| 久久精品无码一区二区日韩AV| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久久久国产精品嫩草影院| 久久久亚洲欧洲日产国码aⅴ| 亚洲欧美精品伊人久久| 亚洲精品99久久久久中文字幕| 久久久久人妻精品一区二区三区| 青青青伊人色综合久久| 亚洲香蕉网久久综合影视 | 久久久亚洲欧洲日产国码aⅴ| 久久久久久毛片免费看| 国产精品一区二区久久不卡| 日韩电影久久久被窝网| 中文字幕一区二区三区久久网站| 欧美激情一区二区久久久| 一本久久a久久精品综合夜夜| 99久久国产宗和精品1上映| 国产精品成人精品久久久| 久久久青草久久久青草| 99精品久久久久久久婷婷 | 亚洲国产精品久久久天堂| 国产综合成人久久大片91| 无码人妻精品一区二区三区久久| 色综合久久天天综线观看| 国产精品成人无码久久久久久| 久久亚洲春色中文字幕久久久 | 精品久久综合1区2区3区激情 | 日本久久久久久久久久| 99久久婷婷国产一区二区| 热re99久久精品国产99热| 99久久夜色精品国产网站| 国产69精品久久久久99尤物| 久久综合丁香激情久久| 日本福利片国产午夜久久| 嫩草影院久久国产精品| 久久精品国产99久久久香蕉| 久久亚洲中文字幕精品一区| 久久久国产精品|