VC 中的ATL和 MFC有什麼區別

2022-04-23 07:51:09 字數 1923 閱讀 7653

atl是activextemplatelibrary的縮寫,它是一套c++模板庫。使用atl能夠快速地開發出高效、簡潔的**,同時對com元件的開發提供最大限度的**自動生成以及視覺化支援。為了方便使用,從microsoftvisualc++5.0版本開始,microsoft把atl整合到visualc++開發環境中。2023年9月推出的visualstudio6.0整合了atl3.0版本。

在atl產生以前,開發com元件的方法主要有兩種:一是使用comsdk直接開發com元件,另一種方式是通過mfc提供的com支援來實現。

直接使用comsdk開發com元件是最基本也是最靈活的方式。通過使用microsoft提供的開發包,我們可以直接編寫com程式。但是,這種開發方式的難度和工作量都很大,一方面,要求開發者對於com的技術原理具有比較深入的了解(雖然對技術本身的深刻理解對使用任何一種工具都是非常有益的,但對於com這樣一整套複雜的技術而言,在短時間內完全掌握是很難的);另一方面,直接使用comsdk要求開發人員自己去實現com應用的每乙個細節,完成大量的重複性工作。這樣做的結果是,不僅降低了工作效率,同時也使開發人員不得不把許多精力投入到與應用需求本身無關的技術細節中。雖然這種開發方式對於某些特殊的應用很有必要,但這種程式設計方式並不符合元件化程式設計方法所倡導的可重用性,因此,直接採用comsdk不是一種理想的開發方式。

使用mfc提供的com支援開發com應用可以說在使用comsdk基礎上提高了自動化程度,縮短了開發時間。mfc採用物件導向的方式將com的基本功能封裝在若干mfc的c++類中,開發者通過繼承這些類得到com支援功能。為了使派生類方便地獲得com物件的各種特性,mfc中有許多預定義巨集,這些巨集的功能主要是實現com介面的定義和物件的註冊等通常在com物件中要用到的功能。開發者可以使用這些巨集來定製com物件的特性。

隨著internet技術的發展,microsoft將activex技術作為其網路戰略的乙個重要組成部分大力推廣,然而使用mfc開發的activexcontrol,**冗餘量大,即所謂的「肥**」(fatcode),而且必須要依賴於mfc的執行時刻庫才能正確地執行。雖然mfc的執行時刻庫只有部分功能與com有關,但是由於mfc的繼承實現的本質,activexcontrol必須揹負執行時刻庫這個沉重的包袱。如果採用靜態連線mfc執行時刻庫的方式,這將使activexcontrol**過於龐大,在網路上傳輸時將佔據寶貴的網路頻寬資源;如果採用動態連線mfc執行時刻庫的方式,這將要求瀏覽器一方必須具備mfc的執行時刻庫支援。總之,mfc對com技術的支援在網路應用的環境下也顯得很不靈活。

mfc對com和ole的支援確實比手工編寫com程式有了很大的進步。但是mfc對com的支援還不夠完善和徹底,例如對com介面定義的idl語言,mfc並沒有任何支援,此外對於近些年來com和activex技術的新發展mfc也沒有提供靈活的支援。這是由mfc設計的基本出發點決定的。mfc被設計成對windows平台程式設計開發的物件導向的封裝,自然要涉及windows程式設計的方方面面,com作為windows平台程式設計開發的乙個部分也得到mfc的支援,但是mfc對com的支援是以其全域性目標為出發點的,因此對com的支援必然要服從其全域性目標。從這個方面而言,mfc對com的支援不能很好地滿足開發者的要求。

對於程式設計師來說,還有乙個區別就是atl要求你懂得更多的com知識,這樣你才能直接使用atl來編寫com元件或者控制項,而mfc甚至不要求你知道com是個什麼東西就能寫出乙個activex控制項來了。

此外,如果你編寫的控制項有gui(圖形使用者介面)的話,你最好使用mfc;如果根本不需要gui,那最好使用atl編寫,當然你也可以選擇mfc來編寫不可見的控制項,但是開銷比atl大,而執行效率卻小於atl;但是有時候這種差別所帶來影響可以忽略掉的話,那麼我建議你還是用mfc來寫,唯一的理由是它開發起來更簡單,易於除錯。如果你是乙個com的門外漢,卻又想使用atl來編寫控制項,那麼建議你先準備半年時間(保守估計)來學習com的理論知識

簡單地說,atl在網路應用普及的今天,開發效果(簡潔\高效)要比mfc好.但我本人覺得mfc也不差!我一直在用mfc做事!

centos中rename和mv有什麼區別

centos中rename命令和mv命令的區別是 1 mv命令只能對單個檔案重新命名,而rename命令除了給單個檔案重新命名,還可以批量對檔案重新命名 2 rename命令是專用於檔案重新命名的,而mv命令還有移動檔案的功能。聯絡 rename和mv都是重新命名的。區別 mv命令只能對單個檔案重新...

atomic 和 nonatomic 有什麼區別

atomic 和 nonatomic 的區別在於,系統自動生成的 getter setter 方法不一樣。atomic 變數預設是有該有屬性的,這個屬性是為了保證在多執行緒的情況下,編譯器會自動生成一些互斥加鎖的 避免該變數的讀寫不同步的問題。nonatomic 如果該物件無需考慮多執行緒的情況,這...

forward和redirect有什麼區別

redirect和forward的定義 1.redirect 重定向 服務端傳送給客戶端乙個重定向的臨時響應頭,這個響應頭包含重定向之後的url,客戶端用新的url重新向伺服器傳送乙個請求。2.forward 請求轉向 伺服器程式內部請求轉向,這個特性允許前乙個程式用於處理請求,而後乙個程式用來返回...