資源描述:
《c 類的動態(tài)組件化技術》由會員上傳分享,免費在線閱讀,更多相關內容在教育資源-天天文庫。
1、C++類的動態(tài)組件化技術論文關鍵詞:COM組件接口生命周期C++類ATL組件類C++基類ATL模板基類繼承論文摘要:在組件化編程的時代,如何復用歷史累積的大量沒有組件特性的C++類?本文從工程的角度對這一問題進行探討,利用現有組件技術,提出了一套將C++類平滑過渡到COM組件的完整解決方案。1.問題的提出自從Microsoft公布了COM技術以后,Windows平臺上的開發(fā)模式發(fā)生了巨大的變化,以COM為基礎的一系列詆組件技術將Windowsル編程帶入了組件化時代,傳統(tǒng)的面向對象的軟件開發(fā)方尿法已經逐漸被面
2、向組件的方法所取代。編輯。COMT標準建立在二進制可執(zhí)行代鏍碼級的基礎上,不論何種工玟具、語言開發(fā)的組件,只要》符合COM規(guī)范,就可復用查于VC、VB、Delph┎i、BC等各種開發(fā)環(huán)境中孑。COM的語言無關性將軟件復用的層次從源代碼級推進到了二進制級,復用更方便,也更安全。然而,C鰨OM技術帶來全新的軟件設票計和開發(fā)模式的同時,也帶昀來了新的問題。許多軟件跖公司在開發(fā)自己的軟件產品31/31過程中,都累積了大量C+┊+類,這些代碼設計精良,罵功能完備,以面向對象的標屢準來檢驗無可挑剔。然而,簦這些
3、代碼不支持COM,將驪無法在COM時代繼續(xù)被復用。如果它們在軟件組件化服的趨勢中被淘汰,那對軟件公司和開發(fā)人員來說都是極社大的損失。COM專家D糾onBox曾說過,“CO蹇MisasuperC++然”。這給了我們一個啟示,瓦是否可以實現一種技術,能ソ夠動態(tài)的為普通C++類加梆上一層COM的封裝呢?這龠樣,既可以保持這些代碼自杳身的完整和特性,使它們能U繼續(xù)應用于原來的系統(tǒng),也鏞可以在需要作為組件使用的時候,把它們動態(tài)轉變成組詈件,復用于新系統(tǒng)。一個頓自然而然的想法是,為每一魁個C++類開發(fā)一個只暴露一
4、個接口的COM組件,將遜原C++類的每個publ強ic方法都對應于該接口的罹一個方法,接口方法的實現可以簡單的調用相對應的Cf++類方法即可。這樣,程≥序邏輯由原有的C++類控制,但COM層的封裝則由組件提供。基本思路如下圖臃所示:本文就這一技術展祺開討論,最終提供一套由普臊通C++類平滑過渡到CO黢M組件的完整解決方案。我攙們選用ATL作為COM組嚙件的開發(fā)工具,開發(fā)環(huán)境為屜VisualStudio泯。如沒有特殊說明,下文中箴的“C++類”指沒有組件廾特性C++類,“C++對蕺象”指C++類的實例;“
5、缽ATL組件類”指用于包裝蔞的ATL類,“ATL對象惡”指ATL組件類的實例。31/312.用ATL包裝C++類按上述思路將C++對象動栗態(tài)組件化后,所得的組件實際上由兩部分組成:ATL組件對象和綁定的C++對弛象。兩者的生命周期互相牽坶制,但要保持一致。生命周櫟期的管理是C++類動態(tài)組_件化的首要難點。C++焐類分為兩種,一種是簡單的C++類,一種是集合型的錄C++類。集合型的C++┲對象管理一組C++對象,碰負責其創(chuàng)建和刪除,維護它棲們的生命周期。下面,分別瀹就簡單C++類和集合型C疇++類的組件化
6、技術進行說眠明,展示解決方案的核心技毋術。簡單C++類的組件壓化為使ATL組件類可以肅自由調用C++類的方法,音需要:l為ATL組件類安插一個指針成員變量,指慌向C++類l提供ATL增對象和C++對象的綁定機演制我們可以在ATL組件去類初始化時創(chuàng)建一個C++あ類,用成員變量m_pCP榧PObj記錄,在析構時刪Ν除,從而實現ATL組件類和C++類的天然綁定。但球出于靈活性考慮,使得AT笱L組件對象可以綁定任意C袢++類的對象,我們?yōu)锳TL組件類添加一個綁定函數錳Link2CPPObj。在ATL組件類的構造
7、函數野內,創(chuàng)建一個C++對象,諛31/31用m_pCPPObj記錄罘。如果調用了Link2婢CPPObj,則將m_p琴CPPObj指向的對象刪棚除,改用傳入的C++對象廡。在ATL組件類的的析沲構函數內,刪除其綁定的C嗤++對象。由構造函數和Link2CPPObj函數例的定義可知,m_pCPPObj指針總是有意義的。簡單C++類組件化的思想炎如下圖所示:集合型C+帔+類的組件化集合型C+肘+類的情況有所不同。集汝合型C++類以數組、列表、映射表的形式管理其它C蹀++對象。集合對象和它管晰理的元素對象都被
8、包裝成組陬件后,集合型ATL對象可罅能調用一個“Destro彤y”方法,期望刪除某一個腦元素ATL對象;這一操作齏的實質卻是,集合型C++對象的“Destroy”ぼ方法被調用,將元素C++額對象刪除了,而元素ATL隴對象卻不知道。這一操作的僑結果導致了元素的ATL對熵象存在,而其綁定的C++憷對象卻被刪除的情況,兩者雪的生命周期出現了不一致。為了解決這個問題,我們需蜆要在C++對象被刪除時,路能將