青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

多人開發的基礎---組件化編程,仿COM篇

引言:

    在大型項目的開發中,隨著開發進度的進行,我們經常碰到模塊之間耦合度太高的問題:由于開發人員經常要在別的模塊中調用自己實現的功能,經常隨意在某個函數中隨意添加調用代碼,造成了被修改的那個函數體過長,邏輯混亂。另一個問題是隨意包含頭文件:開發人員在開發中經常為了要使用某些類的功能而包含引用類的頭文件造成類之間的耦合度太高,被包含類的頭文件一處輕微修改經常就會引起整個程序大規模的編譯和鏈接,當編譯鏈接時間達到一定程度時,程序員就會被誘導去做不會導致大規模重編譯的改動,而不管改動是否會保持原來的設計。

      

常規解決方案:

1.        靜態類庫:設計良好的靜態類庫能實現功能上的隔離,無法避免類庫實現 必須重新編譯、鏈接整個應用程序的問題

2.        DLL:但仍有自己的缺點:

a)       函數重名問題:我們通過函數名來調用DLL的函數,在并行開發中容易造成函數重名。

b)       依賴:如果采用常見的隱式連接,那DLL每發行了一個新版本都有必要和應用程序重新鏈接一次,因為DLL里面函數的地址可能已經發生了改變。

3.        COMDLL的缺點就是COM的優點。但是實際開發中我們會發現COM太復雜了。要使用COM編程,必須要非常熟悉C++中的COM實現細節, 最好之前要有使用和實現COM對象和服務器的經驗。開發中而且必須從.idl開始工作才能加入接口屬性和方法,對開發和使用都有很高的門檻。

 

本文的解決方案簡化的組件編程:

實際上我們只是在開發項目,并不需要跨語言編程,也不需要組件的位置透明性。為了項目而引入COM代價往往太過于巨大。然而COM的內部結構對于大多數程序員是無關的。因此有必要對COM進行簡化以降低編程門檻。使之更符合常規的變成習慣。所以我們借鑒了COM的優秀思想來構建我們的程序架構,使我們的程序能夠像基于COM組件開發那樣的靈活,而開發人員又不需要掌握太多的COM知識。下面我們分步介紹我們的實現過程

一、       總體架構:

 

clip_image002
l
應用程序:軟件的可執行程序(.exe),通過組件管理器來創建組件,組件創建起來后應用程序直接訪問組件,不再通過組件管理器中轉。

l        組件管理器:整個框架的核心部分,它本身是一個DLL文件。應用程序通過它來創建、管理所有的相關DLL。作用類似與COM中的COM庫。它是應用程序加載的第一個DLL

l        組件模塊:以DLL實現的分解后功能模塊。軟件的全部功能都在組件中實現,組件與組件之間,組件和應用程序之間并不直接直接耦合,應用程序或一個組件不能直接創建另一個組件的實例,而必須通過組件管理器創建。組件對外并不暴露出類的實現,而僅是通過組件管理器返回接口的指針。

二、       應用程序運行過程:

應用程序的運行序列圖:

 

clip_image004

1.
        主程序啟動:應用程序在啟動階段調用組件管理器啟動應用程序框架。

2.        組件管理器掃描應用程序目錄下所有的DLL文件,并動態加載DLL,根據事先約好的注冊函數名判斷是否是框架組件

3.        查詢組件A實現的接口

4.        組件A返回它實現的全部接口IDCLSID)。

5.        組件管理器把接口ID和對應的組件文件名登記在內部鏈表中。

6.        3

7.        4

8.        5

9.        啟動過程結束,控制權交還給主程序

10.    業務功能開始:主程序調用組件管理器,啟動所有自啟動接口

11.    組件管理器查詢內部鏈表,創建自啟動接口(組件B實現了自啟動接口)

12.    組件B在初始化函數中啟動了相關的業務功能。

13.    組件B需要用到接口A,但組件B并不知道誰實現了接口A,于是它調用組件管理器來創建接口A

14.    組件管理器查詢鏈表得知組件A實現了接口A

15.    組件管理器調用組件A的導出函數創建接口A的實例

16.    組件A返回接口A的實例指針

17.    組件管理器將接口A的實例指針傳遞給接口B

18.    組件B調用接口A來完成某一功能

19.    組件B使用完接口A,直接調用接口A的函數來釋放接口A占用的資源

20.    主程序運行結束:調用組件管理器釋放所有組件占用資源

21.    組件管理器釋放所有自啟動接口占用資源。直接調用接口B的函數釋放

22.    組件B釋放完畢

23.    應用程序退出

 

 

三、       應用程序的實現:

應用程序的實現比較簡單:僅需在應用程序初始化時加載組件管理器,調用管理器提供的啟動框架,啟動自啟動接口。在退出時調用組件管理器釋放所有組件占用的資源即可

 

clip_image006
四、       組件管理器:

組件管理器是應用程序和組件之間的橋梁。它維護了一張組件接口鏈表。負責整個框架的啟動、組件的創建、還有最后框架資源的釋放工作。組件管理器雖然重要,但它的實現卻很簡單,這里就不在詳講了。

五、       組件:

組件是整個項目的核心,整個應用程序的所有功能都由組件完成。一般而言一個功能點需要由兩個組件來完成,一個提供功能服務,一個為自啟動組件,調用功能服務。

 

clip_image008
1.
        組件的實現:

l        組件對外只暴露出接口,因此每一個組件至少都由兩部分構成,組件接口和組件的實現類。

 

clip_image010
a)
        組件接口:借鑒COM的思想,每一個接口都有唯一的GUID來標示。

   組件接口僅定義了一組類的純虛函數,并不包含實現的任何細節

       b)        實現類:是接口的實現。包含全部的實現細節

l        COM類似,接口分為單實例和多實例接口。因此需要把創建部分分離出來。創建的代碼很相似,所以可以用模板來實現。將公用代碼寫成靜態庫,每個組件包含一份可以減少組件的代碼編寫量。

組件結構圖

 

clip_image012
多實例接口的創建過程:

 

clip_image014
單實例接口的第一次創建過程與多實例一樣。第二次以后的創建為:

 

結果:

a)        開發獨立:每個模塊可以單獨開發,單獨編譯,甚至可以單獨調試和測試。當所有的組件開發完成后把它們組合在一起就得到了完整的應用系統。當需求發生部分變更時并不需要對所有的組件進行修改,只需修改受影響的組件即可。

b)        修改獨立:新增功能只需將實現的DLL放入應用程序目錄即可,不需更改原有代碼。 除了核心模塊,其余功能拼湊可簡單通過增刪DLL實現

c)        模塊獨立:在開發過程中強迫程序員和接口而不是具體的類打交道,防止出現耦合性很強的代碼。

d)        智能擴展,只需將實現特定接口的COM(DLL)防入程序所在的目錄,程序自動創建它,可以在類的初始化函數內實現程序功能。

e)        可重用性強,因為是針對接口開發,只要符合接口規范就可以重用DLL

 

下面我們給出了一個按照仿COM架構實現的Demo

1.        單獨一個Exe也能運行,雖然只是個空殼子沒有功能。

2.        加入ComManager.DLL,于是程序具有了自動擴展功能。

3.        加入了ModuleA.DLL,主界面出現了一個按鈕,右機窗口彈出了一個菜單,按鈕和菜單均可以響應命令。菜單和按鈕的創建和響應命令均在ModuleA.DLL中實現

4.        加入了ModuleB.DLL,主界面出現了另一個按鈕,右機窗口彈出的菜單又多了一項,按鈕和菜單均可以響應命令。新增的菜單和按鈕的創建及響應命令均在ModuleB.DLL中實現

5.        加入Sking.DLL,于是整個程序的界面都具有了膚化效果

6.        加入Log.DLL,于是程序具有了日志功能,可以紀錄模塊創建的順序

7.        。。。。。。。。。。。。。。

8.        。。。。。。。。。。

 

因為程序是基于接口開發的,所以功能的實現和模塊的名字無關,和模塊加載的順序也無關(有興趣可以試一下)----當然ComManager.DLL必須是第一個加載,并且不能更名。

 

posted on 2011-01-10 12:50 肥仔 閱讀(3187) 評論(2)  編輯 收藏 引用 所屬分類: COM

評論

# re: 多人開發的基礎---組件化編程,仿COM篇  回復  更多評論   

文章寫的很好。


可以給我郵箱(liulinqi206@163.com)發一份:
按照仿COM架構實現的Demo 的源碼嗎? 謝謝!
2014-03-02 10:01 | liulinqi

# re: 多人開發的基礎---組件化編程,仿COM篇  回復  更多評論   

終于找到了!真是太棒了,我非常需要這個東西。

所以我衷心地希望您能把你實現的那個Demo發給一份,我會對您感激涕零的。

聯系方式:
QQ:779727118
E-Mail:779727118@qq.com

祝你天天開心!

MichaelLiew
2014-06-11 20:17 | MichaelLiew
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产手机视频精品| 91久久精品www人人做人人爽| 国产精品久久久久天堂| 亚洲一区二区三区激情| 欧美一区免费视频| 激情久久久久久久久久久久久久久久| 久久精品在线| 亚洲精品一区二区三| 午夜视频久久久久久| 激情五月综合色婷婷一区二区| 欧美成人在线免费观看| 亚洲一二三级电影| 嫩草国产精品入口| 制服丝袜亚洲播放| 狠狠色丁香久久婷婷综合_中| 欧美成人情趣视频| 亚洲欧美卡通另类91av| 欧美jizz19hd性欧美| 亚洲香蕉网站| 激情文学一区| 欧美午夜精品久久久久免费视| 欧美一级片一区| 亚洲三级观看| 久久一区视频| 亚洲影院在线| 亚洲欧洲日产国产综合网| 国产精品免费一区二区三区观看| 久久久91精品国产| 亚洲视频axxx| 亚洲国产精品t66y| 久久久午夜精品| 中文高清一区| 亚洲激情在线激情| 国产一区二区三区成人欧美日韩在线观看 | 激情欧美亚洲| 欧美日韩视频不卡| 久久综合图片| 欧美亚洲免费电影| 一本一本a久久| 欧美激情一二区| 久久久国际精品| 亚洲一区二区三区四区五区午夜 | 性8sex亚洲区入口| 99国产精品自拍| 亚洲电影免费观看高清完整版在线 | 国产一级精品aaaaa看| 欧美日韩国产成人在线免费| 久久久久青草大香线综合精品| 亚洲视频欧美视频| 亚洲精品自在久久| 亚洲韩国精品一区| 欧美激情日韩| 老牛国产精品一区的观看方式| 亚洲欧美日韩国产另类专区| 日韩午夜黄色| 亚洲人成网在线播放| 伊人成年综合电影网| 国产一区二区av| 国产欧美1区2区3区| 国产精品青草综合久久久久99 | 欧美一区二区三区免费视| 一区二区三区视频免费在线观看| 亚洲国产一区二区视频| 1769国内精品视频在线播放| 国产伊人精品| 国内精品免费午夜毛片| 国产午夜久久| 精品动漫3d一区二区三区免费版 | 亚洲一卡二卡三卡四卡五卡| 亚洲精品资源| av不卡在线观看| 一区二区激情视频| 一区二区国产精品| 亚洲一区二区三区在线看 | 美乳少妇欧美精品| 久久免费视频网站| 六十路精品视频| 欧美69wwwcom| 欧美日韩一区二区三区| 国产精品成人一区二区网站软件 | 国产精品久久网站| 国产精品亚洲аv天堂网| 国产精品视频九色porn| 国产欧美日韩视频一区二区| 国产偷自视频区视频一区二区| 国产一区二区三区四区五区美女| 国产伊人精品| 久久精品一区二区三区不卡牛牛| 久久国产精品久久精品国产| 久久综合五月| 欧美日韩高清不卡| 国产精品尤物| 一色屋精品视频在线看 | 夜夜嗨av一区二区三区| 亚洲一区二区三区视频播放| 欧美一区三区三区高中清蜜桃| 久久久999精品视频| 免费视频久久| 亚洲乱码国产乱码精品精98午夜| 中文av一区二区| 久久精品噜噜噜成人av农村| 欧美成人亚洲成人日韩成人| 欧美日韩一区二区三区四区在线观看 | 欧美一级在线视频| 欧美**字幕| 国产精品黄色在线观看| 韩国女主播一区二区三区| 亚洲激情在线视频| 午夜久久美女| 欧美激情亚洲国产| 亚洲你懂的在线视频| 另类尿喷潮videofree| 欧美日韩在线播放三区四区| 国产日韩在线不卡| 亚洲免费精彩视频| 久久视频一区二区| 99伊人成综合| 久久综合一区二区| 国产精品一区二区三区久久久| **性色生活片久久毛片| 亚洲欧美日韩精品久久奇米色影视 | 999亚洲国产精| 久久久久一区| 国产精品综合| 一本色道久久综合亚洲精品婷婷| 久久精彩免费视频| 99re6这里只有精品视频在线观看| 久久精品91久久久久久再现| 欧美日韩中文字幕在线| 在线精品视频一区二区| 亚欧成人精品| 亚洲精品在线视频观看| 久久综合久久久久88| 国产欧美日韩三级| 亚洲一区二区三区高清| 欧美激情一区二区三区蜜桃视频| 亚洲永久精品大片| 欧美日韩在线精品| 亚洲毛片一区二区| 免费91麻豆精品国产自产在线观看| 中文一区在线| 欧美日韩免费观看一区二区三区 | 伊人成人开心激情综合网| 性视频1819p久久| 99国产麻豆精品| 欧美精品偷拍| 亚洲精品乱码久久久久久| 久久久久青草大香线综合精品| 亚洲午夜电影在线观看| 欧美日韩一区二区高清| 日韩一级大片| 亚洲精美视频| 欧美国产日本| 亚洲国产欧美在线人成| 免费不卡在线观看| 久久亚洲综合网| 在线电影一区| 欧美大胆a视频| 麻豆国产精品va在线观看不卡| 精品91免费| 欧美~级网站不卡| 久久三级视频| 亚洲国产精品www| 亚洲国产日韩一区| 欧美激情久久久| 一本一本久久a久久精品综合妖精| 91久久国产综合久久91精品网站| 欧美不卡高清| 99在线精品免费视频九九视| 亚洲人成绝费网站色www| 欧美美女操人视频| 亚洲一区二区欧美日韩| 亚洲一区二区三区视频播放| 国产伦精品一区二区三区四区免费| 欧美一级艳片视频免费观看| 亚洲欧美日韩在线不卡| 国语自产精品视频在线看抢先版结局 | 99这里只有精品| 国产精品视频精品视频| 久久精品女人的天堂av| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲黄一区二区三区| 亚洲精品黄色| 国产九九精品| 欧美成人精品激情在线观看| 欧美 亚欧 日韩视频在线| 亚洲色图综合久久| 午夜精品福利视频| 亚洲福利视频三区| 99精品国产福利在线观看免费| 国产精品―色哟哟| 嫩模写真一区二区三区三州| 欧美精品手机在线| 欧美影院精品一区| 蜜臀va亚洲va欧美va天堂| 亚洲无线一线二线三线区别av| 亚洲欧美激情视频| 亚洲人成人一区二区在线观看| 一区二区三区四区国产精品| 激情欧美一区二区三区|