VC++、MFC、COM和ATL的區別
一、什麼是MFC
微軟基礎類(Microsoft Foundation Classes),實際上是微軟提供的,用於在C++環境下編寫應用程式的一個框架和引擎,VC++是WinOS下開發人員使用的專業C++ SDK(SDK,Standard SoftWare Develop Kit,專業軟體開發平臺),MFC就是掛在它之上的一個輸助軟體開發包,MFC作為與VC++血肉相連的部分(注意C++和VC++的區別:C++是一種程式設計語言,是一種大家都承認的軟體編制的通用規範,而VC++只是一個編譯器,或者說是一種編譯器+源程式編輯器的
IDE,WS,PlatForm, MFC同 BC++整合的VCL一樣是一個非智輔式的軟體包,類庫,只不過MFC類是微軟為VC++專配的)。MFC是Win API與C++的結合。
最後要明白MFC不只是一個功能單純的介面開發系統,它提供的類絕大部分用來進行介面開發,關聯一個視窗的動作,但它提供的類中有好多類不與一個視窗關聯,即類的作用不是一個介面類,不實現對一個視窗物件的控制(如建立,銷燬),而是一些在WinOS(用MFC編寫的程式絕大部分都在WinOS中執行)中實現內部處理的類,如資料庫的管理類等。
二、什麼是COM
所謂COM(Componet Object Model,元件物件模型),是一種說明如何建立可動態互變元件的規範,此規範提供了為保證能夠互操作,客戶和元件應遵循的一些二進位制和網路標準。通過這種標準將可以在任意兩個元件之間進行通訊而不用考慮其所處的操作環境是否相同、使用的開發語言是否一致以及是否執行於同一臺計算機。
COM的優點,首先:使用者一般希望能夠定製所用的應用程式,而元件技術從本質上講就是可被定製的,因而使用者可以用更能滿足他們需要的某個元件來替換原來的那個。其次,由於元件是相對應用程式獨立的部件,我們可以在不同的程式中使用同一個元件而不會產生任何問題,軟體的可重用性將大大的得到增強。第三,隨著網路頻寬及其重要性的提高,分散式網路應用程式毫無疑問的成為軟體市場上越來越重要的買點。元件價構可以使得開發這類應用程式的過程得以簡化。
三、什麼是ATL
ATL是ActiveX Template Library的縮寫,它是一套C++模板庫。使用ATL能夠快速地開發出高效、簡潔的程式碼,同時對COM元件的開發提供最大限度的程式碼自動生成以及視覺化支援。
在ATL產生以前,開發COM元件的方法主要有兩種:一是使用COMSDK直接開發COM元件,另一種方式是通過MFC提供的COM支援來實現。
直接使用COMSDK開發COM元件是最基本也是最靈活的方式。通過使用Microsoft提供的開發包,我們可以直接編寫COM程式。但是,這種開發方式的難度和工作量都很大,一方面,要求開發者對於COM的技術原理具有比較深入的瞭解;另一方面,直接使用COMSDK要求開發人員自己去實現COM應用的每一個細節,完成大量的重複性工作。這樣做的結果是,不僅降低了工作效率,同時也使開發人員不得不把許多精力投入到與應用需求本身無關的技術細節中。雖然這種開發方式對於某些特殊的應用很有必要,但這種程式設計方式並不符合元件化程式設計方法所倡導的可重用性,因此,直接採用COMSDK不是一種理想的開發方式。
使用MFC提供的COM支援開發COM應用可以說在使用COMSDK基礎上提高了自動化程度,縮短了開發時間。MFC採用物件導向的方式將 COM的基本功能封裝在若干MFC的C++類中,開發者通過繼承這些類得到COM支援功能。為了使派生類方便地獲得COM物件的各種特性,MFC中有許多預定義巨集,這些巨集的功能主要是實現COM介面的定義和物件的註冊等通常在COM物件中要用到的功能。開發者可以使用這些巨集來定製COM物件的特性。
四、總結
對於程式設計師來說,還有一個區別就是ATL要求你懂得更多的COM知識,這樣你才能直接使用ATL來編寫COM元件或者控制元件,而MFC甚至不要求你知道COM是個什麼東西就能寫出一個ActiveX控制元件來了。此外,如果你編寫的控制元件有GUI(圖形使用者介面)的話,你最好使用MFC;如果根本不需要GUI,那最好使用ATL編寫,當然你也可以選擇MFC來編寫不可見的控制元件,但是開銷比ATL大,而執行效率卻小於ATL;但是有時候這種差別所帶來影響可以忽略掉的話,那麼我建議你還是用MFC來寫,唯一的理由是它開發起來更簡單,易於除錯。
相關文章
- VC++ MFC程式設計版本資訊控制C++C程式程式設計
- 不用ATL框架純手工實現COM程式外回撥框架
- ../和./和/的區別
- LinkedList和ArrayList的區別、Vector和ArrayList的區別
- http和https的區別/get和post的區別HTTP
- ||和??的區別
- /*和/**的區別
- jquery $(this) 和this的區別jQuery
- JQuery this和$(this)的區別jQuery
- T和?的區別
- makefile =和:=的區別
- ++a和a++的區別
- ./ 和sh 的區別
- 和區別
- springmvc和springboot的區別SpringMVCSpring Boot
- SDK和API的區別?API
- ArrayList和LinkedList的區別?
- button和submit的區別MIT
- MTV和MVC的區別MVC
- hadoop和spark的區別HadoopSpark
- rpop 和 brpop的區別
- WebApi和MVC的區別WebAPIMVC
- GET和POST的區別?
- ArrayList和LinkedList的區別
- WBS和TASK的區別?
- JavaScript中for in 和for of的區別JavaScript
- innerText 和 textContent 的區別?
- var 和 let 的區別
- @JsonProperty和@JsonAlias的區別JSON
- POST 和 GET 的區別
- sass和less的區別
- MySQL和Oracle的區別MySqlOracle
- sizeThatFits 和 sizeToFit的區別
- GitHub和GitLab的區別GithubGitlab
- Js中for in 和for of的區別JS
- isKindOfClass和isMemberOfClass的區別
- innerText和textContent的區別
- cookie和session的區別CookieSession