2014-8-14閱讀169 評論0程序員
com英文爲Component Object Model(組件對象模型),是微軟生產軟件組件的標準。面試
它是構造二進制兼容軟件組件的規範,無論組件應用何種語言編寫只要遵循com規範就能夠相互直接通訊。提出com規範主要是爲了知足:編程
1.程序的快速開發,能夠將一個大型的工程分紅若干個com組件同時開發。小程序
2.能夠動態的插入或卸載com組件。設計模式
3.能夠隱藏或封裝com組件內部的實現細節。瀏覽器
com組件能夠由不一樣的語言進行編寫,但com組件之間的通訊是經過組件的接口來實現的,com組件接口的實現是統一的,它採用的是虛擬函數表(VTBL)形式。虛擬函數表中包含了組件函數的一組指針,咱們能夠經過這組指針來獲取咱們想要通訊的組件函數的內存地址。dll(動態連接庫)是包含函數和數據的模塊的集合。它能夠導出數據也能夠導出函數以供其它的dll調用。dll的加載能夠經過靜態連接和動態連接兩種方式。安全
1.靜態連接時將所要連接的dll模塊以二進制的形式編譯進其餘模塊。服務器
2.動態連接指調用模塊在運行時加載DLL,使用LoadLibrary函數或LoadLibraryEx函數將dll加載到進程的地址空間,並調用GetProcAddress函數以獲取導出的 DLL函數的地址。網絡
動態加載dll的優勢:框架
1.DLL可節省內存並減小交換。經過在內存中共享 DLL的單個副本,多個進程能夠同時使用一個DLL。相比之下,對於使用靜態連接庫構建的每個應用程序,Windows 都要在內存中爲其加載庫代碼的一個副本。
2.DLL 可節省磁盤空間。 多個應用程序能夠共享磁盤上的一個 DLL副本。相比之下,使用靜態 連接庫構建的每個應用程序都須要讓連接到程序文件映像的庫代碼做爲一個單獨的專用副本。
dll與com的關係:com是一種規範,按照是com規範實現的dll能夠被視爲com組件,
例如咱們用mfc創建的Active X控件工程其中的接口封裝是靠idl描述的因此能夠視爲com組件。並且從上面關於com和dll的說明能夠看出com組件的接口是一組具備特定規範的函數,因此com組件能夠別視爲dll但dll不必定是com組件。
com和DLL最大的區別就是: dll是以函數集合的方式來調用的是編程語言相關的象VC必須加上extern "C"...而COM是以interface的方式提供給用戶使用的是一種二進制的調用規範,是與編程語言無關的,它使用idl接口定義語言來描述本身使用類繼承來實現本身的功能和方法.DLL只有DLL一種形勢,裏面可任意定義函數無限制,只能運行在本機上而COM有DLL和EXE兩種存在形勢: COM所在的DLL中必須導出四個函數:
dllgetobjectclass,dllregisterserver, dllunregisterserver,dllunloadnow這四個函數各有做用,有些是提供給COM管理器用的,經過CLSID和IID來使用,有些是提供給註冊機用的.COM結合MTS,就是COM+, 是DCOM的高級版本,提供了更爲強大和安全的分佈式COM服務,DCOM運行在不一樣的機器上 用proxy和stub來實現遠程接口的本地映射 兩者從執行速度來講 兩者相差無幾 可是啓動速度DLL要比COM快!
我想你應該知道類庫和框架(最典型的就是MFC)的概念,它們是提供源代碼級複用的,也就是說類庫是以源代碼的形式分發的,類庫的使用者(好比使用MFC開發應用程序的咱們)要把實現代碼加入到他們的工程中去,而後編譯連接,這時候類庫中的源代碼就成爲了你的應用程序中的一部分,未來若是要是類庫的設計者從新修改了他們的類庫,那麼你的應用程序就須要從新編譯連接你的應用程序,這對於已經到了最終用戶手中的你的應用程序的升級很麻煩,並且一個最終用戶的機子上有可能有不少個程序使用了同一個類庫當中的相同類的話就會出現一些多餘的代碼!
這就須要提供一種機制來解決上面的問題,把你的可重用的代碼作成一個Dll的形式包裝起來是一個可行的方法,在這個Dll中導出一些你須要提供給第三方使用的類、全局函數、數據等,這樣你就能夠在最終用戶的機器上保持一份你的Dll,其它應用程序經過調用你Dll中的引出函數就能夠實現代碼共享,這樣若是你之後升級了你的Dll(保持接口不變),最終用戶只要獲得這個新的Dll覆蓋掉原先的那個舊Dll不用更改任何東西就可使他機子上的程序保持最新了,並且因爲代碼只有一份,在運行時使用的空間也比使用類庫開發的程序來得少。
可是上面這種使用Dll的方案仍是有缺陷的,因爲每一個編譯器都會加入它本身的一些獨特的語言特徵。好比Dll我是使用Visual C++開發的,裏面有異常處理的代碼,如今我在Borland C++中使用這個Dll,那麼它將沒法捕捉到這些異常;再舉個例子,若是這個Dll導出了一個類,而這個類在新的Dll中增長了一些成員變量(也就是說這個類的對象佔用的內存增長了),那麼在最終用戶機子上的原先使用舊的Dll而改用了新的Dll的應用程序若是沒有從新編譯連接的話會產生非法操做,由於C++的編譯模型要求應用程序在編譯的時候就須要知道對象佔用的空間,原先使用了舊的Dll的應用程序因爲沒有通過從新編譯連接,它所認得的仍是原先Dll中的類的對象的大小,最終用戶機子換成了新的Dll後,那個舊的應用程序當訪問這些新的成員變量的時候就會產生越界非法操做。其實Dll還有其它許多缺陷的!
根據這些,咱們須要更好的重用機制(在二進制級別的),在Windows下,大量用到的非COM所屬了。其基本的思想就是它實現了真正的接口與代碼實現的分離,並且它是與語言無關的。COM分爲進程內組件(編譯連接成Dll或者Ocx文件,本質上同樣,一個無界面另外一個有界面)和進程外組件(編譯連接成Exe文件),這些組件會提供一些接口供第三方調用。其它有關COM的知識若是要講起來的話那但是長篇累牘,能夠看看相關的書籍。
這陣子在想一個須要利用com組件的小程序怎麼作,忽然想起上次去面試的時候考官問過autocad開發時爲何要利用com,而不採用通常的dll呢? 到google上查了一下,許多人也問了同樣的問題:) 用com來寫程序要比普通的dll麻煩一些,可是帶來的好處也大不少,尤爲是在開發像autocad這樣大型軟件的時候,須要跨區域來協同工做。 「學習COM,首先要知道COM的目的是什麼,它解決了一個什麼樣的問題,在此基礎上,MS提供了各式各樣的可擴展的COM服務,COM編程接口。這些服務和接口恐怕一個程序員一生都不可能通曉,由於發展是如此之快。你們也沒有必要通曉這些接口,就象對待大量的WIN API的態度,用到時再查幫助。
COM的各類努力都是在規定了一種二進制交互的協議。提及來簡單,作起來至關複雜,要使使用不一樣語言編寫的客戶可以使用任意語言編寫的服務程序談何容易!這裏說語言仍是把問題簡單化了,由於每種語言還有各式各樣的編譯器,不一樣編譯器出來的二進制代碼如何交互?
就拿DLL來講,DLL是對靜態鏈接的一種改進,帶來了更細的開發分工,也帶來了不少問題,其中就有二進制如何交互的問題。這個問題當DLL輸出類時更加突出。COM爲解決此問題提出了極負創意的解決方案,不只如此,更進一步引伸,提出瞭如何跨 網絡的交互。而後,針對internet服務器的開發提出COM+。COM體系中融合了多種經典的設計模式,能夠說是一種更加精幹的C++。
COM博大精深,若干大師仍須半年的mental fog, 方能有豁然開朗之時。咱們這些晚輩,還需多加修煉纔對,但決不止是COM「
一、COM組件以接口對功能分類,便於組織;DLL特別是大的DLL,函數一大堆,難以組織;
二、COM組件便於升級維護,功能擴充,只需添加接口就行;DLL升級困難,函數不能隨意改變;
三、COM建立調用有很好的安全性,DLL沒有;
四、COM組件可輕鬆實現進程間調用,DLL很困難;
五、COM組件可輕鬆實現分佈式調用,DLL不可能;
六、COM組件具備封裝、繼承、多態的面向對象特徵,DLL只有封裝;
七、在COM組件的基礎上實現了大量功能:ActiveX,OLE等;
Activex、OLE、COM、OCX、DLL之間的區別
熟悉面向對象編程和網絡編程的人必定對ActiveX、OLE和 COM/DCOM這些概念不會陌生,可是它們之間到底是什麼樣的關係,對許多們仍是比較模糊的。在具體介紹它們的關係之間,咱們仍是先明確組件 (Component)和對象(Object)之間的區別。組件是一個可重用的模塊,它是由一組處理過程、數據封裝和用戶接口組成的業務對象(Rules Object)。組件看起來像對象,但不符合對象的學術定義。它們的主要區別是: 1)組件能夠在另外一個稱爲容器(有時也稱爲承載者或宿主)的應用程序中使用,也能夠做爲獨立過程使用; 2)組件能夠由一個類構成,也能夠由多個類組成,或者是一個完整的應用程序; 3)組件爲模塊重用,而對象爲代碼重用。如今,比較流行的組件模型有COM(Component Objiect Module,對象組件模型)/DCOM( Distributed COM,分佈式對象組件模型)和CORBA(Common Object Request Broker Architecture,公共對象請求代理體系結構)。到這裏,已經出現了與本文相關的主題COM,而CORBA與本文無關,就不做介紹。之因此從組件 與對象的區別提及,是想讓你們明確COM和 CORBA是處在整個體系結構的最底層,若是暫時對此還不能理解,不妨繼續往下看,最後在回過頭看一看就天然明白了。如今開始闡述ActiveX、OLE 和COM的關係。首先,讓你們有一個整體的概念,從時間的角度講,OLE是最先出現的,而後是COM和ActiveX;從體系結構角度講,OLE和 ActiveX是創建在 COM之上的,因此COM是基礎;單從名稱角度講,OLE、ActiveX是兩個商標名稱,而COM則是一個純技術名詞,這也是你們更多的據說 ActiveX和OLE的緣由。既然OLE是最先出現的,那麼就從OLE提及,自從Windows操做系統流行以來,「剪貼板」( Clipboard)首先解決了不一樣程序間的通訊問題(由剪貼板做爲數據交換中心,進行復制、粘貼的操做),可是剪貼板傳遞的都是「死」數據,應用程序開 發者得自行編寫、解析數據格式的代碼,因而動態數據交換(Dynamic Data Exchange,DDE)的通訊協定應運而生,它可讓應用程序之間自動獲取彼此的最新數據,可是,解決彼此之間的「數據格式」轉換仍然是程序員沉重的 負擔。對象的連接與嵌入(Object Linking and Embedded,OLE)的誕生把原來應用程序的數據交換提升到「對象交換」,這樣程序間不但得到數據也一樣得到彼此的應用程序對象,而且能夠直接使用 彼此的數據內容,其實OLE是Microsoft的複合文檔技術,它的最第一版本只是瞄準複合文檔,但在後續版本OLE2中,導入了COM。因而可知, COM是應OLE的需求而誕生的,因此雖然COM是OLE的基礎,但OLE的產生卻在COM以前。 COM的基本出發點是,讓某個軟件經過一個通用的機構爲另外一個軟件提供服務。COM是應OLE 的需求而誕生,但它的第一個使用者倒是OLE2,因此COM與複合文檔間並無多大的關係,實際上,後來COM就做爲與複合文檔徹底無關的技術,開始被廣 泛應用。這樣一來, Microsoft就開始「染指」通用平臺技術。可是COM並非產品,它須要一個商標名稱。而那時Microsoft的市場專家們已經選用了OLE做爲 商標名稱,因此使用COM技術的都開始貼上了 OLE的標籤。雖然這些技術中的絕大多數與複合文檔沒有關係。Microsoft的這一作法讓人產生這樣一個誤解OLE是僅指複合文檔呢?仍是不僅僅指復 合文檔?其實OLE是COM的商標名稱,天然不只僅指複合文檔。但Microsoft本身恐怕沒法解釋清楚,這要花費至關的精力和時間。 因而,隨着Internet的發展,在1996年春,Microsoft改變了主意,選擇ActiveX做爲新的商標名稱。ActiveX是指寬鬆定義 的、基於COM的技術集合,而OLE仍然僅指複合文檔。固然, ActiveX最核心的技術仍是COM。ActiveX和OLE的最大不一樣在於,OLE針對的是桌面上應用軟件和文件之間的集成,而ActiveX則以提 供進一步的網絡應用與用戶交互爲主。到這裏,你們應該對ActiveX、OLE和COM三者的關係有了一個比較明確的認識,COM纔是最根本的核心技術, 因此下面的重點COM。讓對象模型徹底獨立於編程語言,這是一個很是新奇的思想。這一點從C++和Java的對象概念上,咱們就能有所瞭解。但所謂COM 對象到底是什麼呢?爲了便於理解,能夠把COM看做是某種(軟件)打包技術,即把它看做是軟件的不一樣部分,按照必定的面向對象的形式,組合成能夠交互的過 程和以組支持庫。COM對象能夠用C++、Java和VB等任意一種語言編寫,並能夠用DLL或做爲不一樣過程工做的執行文件的形式來實現。使用COM對象 的瀏覽器,無需關心對象是用什麼語言寫的,也無須關心它是以DLL仍是以另外的過程來執行的。從瀏覽器端看,無任何區別。這樣一個通用的處理技巧很是有 用。例如,由用戶協調運行的兩個應用,能夠將它們的共同做業部分做爲COM對象間的交互來實現(固然,如今的OLE複合文檔也能作到)。爲在瀏覽器中執行 從Web服務器下載的代碼,瀏覽器可把它看做是COM對象,也就是說,COM技術也是一種打包可下載代碼的標準方法(ActiveX控件就是執行這種功能 的)。甚至連應用與本機OS進行交互的方法也能夠用COM來指定,例如在Windows和Windows NT中用的是新API,多數是做爲COM對象來定義的。可見,COM雖然起源於複合文檔,但卻可有效地適用於許多軟件問題,它畢竟是處在底層的基礎技術。 用一句話來講,COM是獨立於語言的組件體系結構,可讓組件間相互通訊。隨着計算機網絡的發展,COM進一步發展爲分佈式組件對象模型,這就是 DCOM,它相似於CORBA的ORB,本文對此將再也不作進一步的闡述。經過上面的講述相信你們必定對ActiveX、OLE和COM/DCOM的關係有 了一個清楚的瞭解。
使用Windows的人對於ActiveX控制必定不會陌生,它提供了一種相似於DLL動態連接庫的調用,不過它與DLL的惟一區別就是ActiveX不 註冊不能被系統識別並使用。那麼,當咱們獲得一個ActiveX沒有被正確安裝且不能使用的消息後,又要安裝ActiveX怎麼辦呢?1. Regsvr32程序法在Windows的System文件夾下有一個regsvr32.exe的程序,它就是Windows本身帶的ActiveX註冊 和反註冊工具。利用它也可以很是方便地註冊AcitveX控件,它的用法爲:regsvr32/u/s/n/i dllname, dllname其中dllname爲ActiveX控件文件名,建議在安裝前拷貝到System文件夾下參數有以下意義:/u - 反註冊控件/s - 無論註冊成功與否,均不顯示提示框/c - 控制檯輸出/i - 跳過控件的選項進行安裝 (與註冊不一樣)/n - 不註冊控件,此選項必須與/i 選項一塊兒使用例如筆者要註冊一amovie.ocx控件,則打入 regsvr32 amovie.ocx便可,要反註冊它時只需使用 regsvr32 /u amovie.ocx就好了。2.註冊表法所謂註冊AcitveX,無非是將一些信息記錄在Windows的註冊表中,如Shockwave Flash Object控件,咱們能夠運行Regedit.exe註冊表編輯程序,利用關鍵字進行搜索,而後把搜索獲得後的註冊表導出爲一REG註冊表文件,再將其 相應的ActiveX文件拷貝到Windows的System文件夾(通常ActiveX的文件名爲OCX,安裝在Windows的System文件夾 內)下,最後在要安裝ActiveX的機器上雙擊導入剛纔導出的註冊表文件便可完成安裝。