• <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>

            逛奔的蝸牛

            我不聰明,但我會(huì)很努力

               ::  :: 新隨筆 ::  ::  :: 管理 ::
            轉(zhuǎn)自: http://www.qtcn.org/bbs/read.php?tid=14719
            現(xiàn)在有些軟件有自動(dòng)升級(jí)功能,有些就是下載新的DLL文件,替換原來(lái)的動(dòng)態(tài)鏈接庫(kù).
            MFC好象也有類似機(jī)制

            Qt還有一種方式,就是把一個(gè)QWidget子類,編譯成動(dòng)態(tài)鏈接庫(kù).然后根據(jù)動(dòng)態(tài)鏈接庫(kù)創(chuàng)建一個(gè)對(duì)象,返回QWidget子針,如果你的類不是QWidget的子類,就不能用這種方法了

            QLibrary也是用來(lái)加載動(dòng)態(tài)鏈接庫(kù),但它創(chuàng)建出來(lái)返回的是某個(gè)"方法的指針"(不需要頭文件),而QPluginLoader創(chuàng)建返回的是"對(duì)象的指針"(對(duì)象中有哪些方法可調(diào)用,就要頭文件說(shuō)了,所以上面的例子中,需要提供一個(gè)接口頭文件)
            ****************************************************************************************************************************************************************
            昨天一個(gè)同事說(shuō)要把一個(gè)類做成DLL的形式,但這個(gè)類不是從QWidget繼承。 研究了一下,發(fā)現(xiàn)Qt提供了一個(gè)類QPluginLoader可以加載動(dòng)態(tài)鏈接庫(kù)。能把一個(gè)普通的類編譯生成DLL,通過(guò)QPluginLoader使用它。

            寫一個(gè)例子說(shuō)明吧:
            工程A中,使用了這樣一個(gè)類,專門用來(lái)讓算所得稅;
            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);
            ............
            }
            編譯后部署到機(jī)器上.

            如果計(jì)稅方式變了,則incomeTax()必須改寫了;
            Tax::incomeTax(int income)
            {
            float res=(income-2000)*0.3;
            return res;
            }


            頭文件沒(méi)有變,只是修改了計(jì)稅方式,工程A必須重新編譯,然后重新部署; 如果工程A很大或部署的機(jī)器很多,代價(jià)就大了.
            如果讓Tax類,單獨(dú)編譯成動(dòng)態(tài)鏈接庫(kù),再把Tax中的要被使用的接口寫在另一個(gè)頭文件中,供工程A使用;每次計(jì)稅方式變了,只需修改Tax類,然后重新編譯生成動(dòng)態(tài)鏈接庫(kù),然后替換工程A中的相應(yīng)的動(dòng)態(tài)鏈接庫(kù).而工程A不用重新編譯即可使用新的計(jì)稅方式.

            新建一工程B,專門用來(lái)把Tax類做成動(dòng)態(tài)連接庫(kù)的形式:

            //首先定義接口(只要一個(gè)頭文件即可)
            Tax.h
            class Tax
            {
                virtual float incomeTax(int income);
            };
            QT_BEGIN_NAMESPACE
            Q_DECLARE_INTERFACE(Tax,"TaxDLL/1.0");  //這個(gè)宏用聲明接口
            QT_END_NAMESPACE


            然后從寫一個(gè)具體業(yè)務(wù)類,繼承上面的接口和QObject,實(shí)現(xiàn)接口中定義的方法
            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);    //這個(gè)宏用來(lái)導(dǎo)出動(dòng)態(tài)鏈接庫(kù)

            編譯工程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中原來(lái)的庫(kù).而工程A不必重新編譯即可使用新的計(jì)稅方式.

            ****************************************************************************************************************************************************************
            現(xiàn)在有些軟件有自動(dòng)升級(jí)功能,有些就是下載新的DLL文件,替換原來(lái)的動(dòng)態(tài)鏈接庫(kù).
            MFC好象也有類似機(jī)制

            Qt還有一種方式,就是把一個(gè)QWidget子類,編譯成動(dòng)態(tài)鏈接庫(kù).然后根據(jù)動(dòng)態(tài)鏈接庫(kù)創(chuàng)建一個(gè)對(duì)象,返回QWidget子針,如果你的類不是QWidget的子類,就不能用這種方法了

            QLibrary也是用來(lái)加載動(dòng)態(tài)鏈接庫(kù),但它創(chuàng)建出來(lái)返回的是某個(gè)"方法的指針"(不需要頭文件),而QPluginLoader創(chuàng)建返回的是"對(duì)象的指針"(對(duì)象中有哪些方法可調(diào)用,就要頭文件說(shuō)了,所以上面的例子中,需要提供一個(gè)接口頭文件)
            posted on 2009-08-29 09:43 逛奔的蝸牛 閱讀(4652) 評(píng)論(1)  編輯 收藏 引用 所屬分類: Qt

            評(píng)論

            # re: Qt: Qt中動(dòng)態(tài)鏈接庫(kù)的使用 2009-08-29 10:18 暗金裝備
            QLibrary也是用來(lái)加載動(dòng)態(tài)鏈接庫(kù),但它創(chuàng)建出來(lái)返回的是某個(gè)"方法的指針"(不需要頭文件),而QPluginLoader創(chuàng)建返回的是"對(duì)象的指針"(對(duì)象中有哪些方法可調(diào)用,就要頭文件說(shuō)了,所以上面的例子中,需要提供一個(gè)接口頭文件)  回復(fù)  更多評(píng)論
              

            99久久99久久| 国产精品岛国久久久久| 久久中文字幕人妻丝袜| 久久久久亚洲AV无码专区体验| 久久ww精品w免费人成| 国产午夜精品理论片久久| 人妻无码精品久久亚瑟影视| 久久久噜噜噜www成人网| 亚洲国产精品婷婷久久| 欧美成人免费观看久久| 品成人欧美大片久久国产欧美| 久久无码中文字幕东京热| 久久九九青青国产精品| 久久精品国产乱子伦| 久久93精品国产91久久综合| 婷婷久久久亚洲欧洲日产国码AV| 日本一区精品久久久久影院| 人妻精品久久无码专区精东影业| 久久精品国产亚洲7777| 久久亚洲精品中文字幕三区| 精品久久久久久中文字幕大豆网| 久久99国产精品成人欧美| AAA级久久久精品无码片| 久久精品国产亚洲AV蜜臀色欲 | 久久久久亚洲AV无码专区桃色| 久久精品人人做人人爽97 | 久久国产一片免费观看| 久久人人爽人人爽人人片av高请| 中文字幕精品久久| 久久久久综合国产欧美一区二区| 久久久久久久综合日本亚洲| 亚洲精品乱码久久久久久| 国产精品久久新婚兰兰| 久久影视国产亚洲| 亚洲人AV永久一区二区三区久久| 久久久久久久国产免费看| 国产午夜电影久久| 久久久久久噜噜精品免费直播 | 狠狠综合久久综合中文88| 一本伊大人香蕉久久网手机| 国产激情久久久久影院|