組件對象模型
組件對象模型
組件徠對象模型(Component Object Model,COM) 是基於Windows 平台的一套組件對象介面標準,由一組構造規範和組件對象庫組成。一般的對象是由數據成員和作用在其上的方法組成,而組件對象和一般對象雖有相似性,但又有較大不同。組件對象不使用方法而用介面來描述自身。介面被定義為“在對象上實現的一組語義上相關的功能”,其實質是一組函數指針表,每個指針必須初始化指向某個具體的函數體。一個組件對象實現的介面數量沒有限制。
COM是微軟自1993年便提出的組件式軟體平台,用來做進程間通信(Inter-process communication, IPC)以及當作組件式軟體開發的平台。COM提供跟編程語言無關的方法實現一個軟體對象,因此可以在其他環境中運行。COM要求軟體組件必須遵照一個共同的介面,該介面與實現無關,因此可以隱藏實現屬性,並且被其他對象在不知道其內部實現的情形下正確的使用。
COM並被實現於多個平台之上,並不限於Windows操作系統之上。但還是只有Windows最常使用COM,且某些功能已被目前的.NET平台取代。
Windows 操作系統提供了三種應用程式間的通訊機制:剪貼板(clipboard)、DDE與OLE。OLE原名是物件連結與嵌入(Object Linking and Embedding),OLE可說是DDE的改良版,OLE 1.0版提供複合文件(compound document)處理。但過於複雜,Brockschmidt, Kraig「Inside OLE」一書中提到,必須經過六個月的心靈混沌期,才能了解OLE是什麼。因此OLE 2.0后,微軟提出COM架構。所有OLE元件皆是繼承COM而來,這些技術包含OLE Document和OLE Controls、Drag and Drop等。
COM是基於組件對象方式概念來設計的,在基礎中,至少要讓每個組件都可以支持二個功能:
• 查詢組件中有哪些界面
• 讓組件做自我生命管理,此概念的實踐即為引用計數(Reference Counting)
這二個功能即為COM的根:IUnknown介面所提供的IUnknown::QueryInterface(),IUnknown::AddRef()及IUnknown::Release()三個方法的由來。所有的COM組件都要實現IUnknown,表示每個COM組件都有相同的能力。
只由COM派生實現出來的組件,稱為 純COM組件。
但在Windows持續發展時,Visual Basic 4.0開始支持OCX,也就是OLE Custom Control,這讓微軟開始思考要如何讓COM組件可以跨語言支持,在這樣的要求下,必須要提供一個一致的介面,以及提供一組可以調用介面內方法的能力,由於純COM組件只能夠支持C/C++的直接訪問,為了要達到跨語言的能力,在COM中必須要支持在外部調用內部方法的機能,這個機能造就了Invoke()方法,另外為了跨語言的支持,COM應該要提供簡單的組件訪問識別方式,這也就是會有GetIDsOfNames()的原因,將這些方法組合起來,定義出的必要介面,稱為IDispatch介面,所有實現此介面的,都可以支持跨語言的支持。
微軟將實現此介面的組件都稱為 自動化(Automation)組件。
COM曾是Windows平台下主要的軟體開發平台,並且影響至其他許多相關軟體技術。
COM+
COM+是微軟Windows 2000中,Microsoft Transaction Server的強化實現版本,除了提供基本的組件交易支持外,還提供了鬆散藕合式事件(loosely-coupled events)與對象共用池(object pooling)等應用程序伺服器的能力,成為Windows 2000開始在微軟平台上主要的應用程序伺服器平台,目前.NET Framework也提供了System.EnterpriseServices命名空間以支持COM+。
Distributed COM
徠Distributed COM是可以在網路上通信的COM組件,依據RPC(Remote Procedure Call)的規範來發展的,它將COM組件的能力擴及到網路上,但是因為網路安全以及防火牆的問題,讓設備上下文OM無法廣泛的流行。
.NET
.NET Framework是新一代的Microsoft Windows應用程序開發平台。