1. 程式人生 > >[科普]Activex、OLE、COM、OCX、DLL

[科普]Activex、OLE、COM、OCX、DLL

原創文章,歡迎轉載。轉載請註明:轉載自 祥的部落格

1. 基礎

熟悉面向物件程式設計和網路程式設計的人一定對ActiveXOLECOM/DCOM這些概念不會陌生,但是它們之間究竟是什麼樣的關係,對許多們還是比較模糊的。在具體介紹它們的關係之間,我們還是先明確元件(Component)物件(Object)之間的區別。

元件是一個可重用的模組,它是由一組處理過程、資料封裝和使用者介面組成的業務物件(Rules Object)。元件看起來像物件,但不符合物件的學術定義。它們的主要區別是:

  1. 元件可以在另一個稱為容器(有時也稱為承載者或宿主)的應用程式中使用,也可以作為獨立過程使用;
  2. 元件可以由一個類構成,也可以由多個類組成,或者是一個完整的應用程式
  3. 元件為模組重用,而物件為程式碼重用。現在,比較流行的元件模型有COM(Component Objiect Module,物件元件模型)/DCOM(Distributed COM,分散式物件元件模型)和ORBA(Common Object Request Broker Architecture,公共物件請求代理體系結構)。

到這裡,已經出現了與本文相關的主題COM,而CORBA與本文無關,就不作介紹。之所以從元件與物件的區別說起,是想讓大家明確 COMCORBA是處在整個體系結構的最底層,如果暫時對此還不能理解,不妨繼續往下看,最後在回過頭看一看就自然明白了。

2.關係

現在開始闡述ActiveXOLECOM的關係。

  • 首先,讓大家有一個總體的概念,從時間的角度講,OLE是最早出現的,然後是COMActiveX
  • 從體系結構角度講,OLEActiveX是建立在COM之上的,所以COM是基礎;
  • 單從名稱角度講,OLEActiveX是兩個商標名稱,而COM則是一個純技術名詞,這也是大家更多的聽說ActiveXOLE的原因。

既然OLE是最早出現的,那麼就從OLE說起,自從Windows作業系統流行以來,“剪貼簿”(Clipboard) 首先,解決了不同程式間的通訊問題 ( 由剪貼簿作為資料交換中心,進行復制、貼上的操作),但是剪貼簿傳遞的都是“死”資料

,應用程式開發者得自行編寫、解析資料格式的程式碼,於是動態資料交換 ( Dynamic Data Exchange,DDE ) 的通訊協定應運而生,它可以讓應用程式之間自動獲取彼此的最新資料。但是,解決彼此之間的“資料格式”轉換仍然是程式設計師沉重的負擔。物件的連結與嵌入(Object Linking and Embedded,OLE)的誕生把原來應用程式的資料交換提高到“物件交換”,這樣程式間不但獲得資料也同樣獲得彼此的應用程式物件,並且可以直接使用彼此的資料內容,其實OLEMicrosoft的複合文件技術,它的最初版本只是瞄準複合文件,但在後續版本OLE2中,匯入了COM。由此可見,COM是應OLE的需求而誕生的,所以雖然COMOLE的基礎,但OLE的產生卻在COM之前。

COM的基本出發點是,讓某個軟體通過一個通用的機構為另一個軟體提供服務。COM是應OLE 的需求而誕生,但它的第一個使用者卻是OLE2,所以COM與複合文件間並沒有多大的關係,實際上,後來COM就作為與複合文件完全無關的技術,開始被廣泛應用。這樣一來,Microsoft就開始“染指”通用平臺技術。但是COM並不是產品,它需要一個商標名稱。而那時Microsoft的市場專家們已經選用了OLE作為商標名稱,所以使用COM技術的都開始貼上了 OLE的標籤。雖然這些技術中的絕大多數與複合文件沒有關係。Microsoft的這一做法讓人產生這樣一個誤解OLE是僅指複合文件呢?還是不單單指複合文件?其實OLECOM的商標名稱,自然不僅僅指複合文件。但Microsoft自己恐怕無法解釋清楚,這要花費相當的精力和時間。

於是,隨著Internet的發展,在1996年春,Microsoft改變了主意,選擇ActiveX作為新的商標名稱。ActiveX是指寬鬆定義的、基於COM的技術集合,而OLE仍然僅指複合文件。當然, ActiveX最核心的技術還是COM

ActiveXOLE的最大不同在於,OLE針對的是桌面上應用軟體和檔案之間的整合,而ActiveX則以提供進一步的網路應用與使用者互動為主。到這裡,大家應該對ActiveXOLECOM三者的關係有了一個比較明確的認識,COM才是最根本的核心技術,所以下面的重點COM

讓物件模型完全獨立於程式語言,這是一個非常新奇的思想。這一點從C++Java的物件概念上,我們就能有所瞭解。但所謂COM物件究竟是什麼呢?為了便於理解,可以把COM看作是某種(軟體)打包技術,即把它看作是軟體的不同部分,按照一定的面向物件的形式,組合成可以互動的過程和以組支援庫。COM物件可以用C++JavaVB等任意一種語言編寫,並可以用DLL作為不同過程工作的執行檔案的形式來實現。使用COM物件的瀏覽器,無需關心物件是用什麼語言寫的,也無須關心它是以DLL還是以另外的過程來執行的。從瀏覽器端看,無任何區別。這樣一個通用的處理技巧非常有用。例如,由使用者協調執行的兩個應用,可以將它們的共同作業部分作為COM物件間的互動來實現(當然,現在的OLE複合文件也能做到)。為在瀏覽器中執行從Web伺服器下載的程式碼,瀏覽器可把它看作是COM物件,也就是說,COM技術也是一種打包可下載程式碼的標準方法(ActiveX控制元件就是執行這種功能的)。甚至連應用與本機OS進行互動的方法也可以用COM來指定,例如在WindowsWindows NT中用的是新API,多數是作為COM物件來定義的。可見,COM雖然起源於複合文件,但卻可有效地適用於許多軟體問題,它畢竟是處在底層的基礎技術。

用一句話來說,COM是獨立於語言的元件體系結構,可以讓元件間相互通訊。隨著計算機網路的發展,COM進一步發展為分散式元件物件模型,這就是DCOM,它類似於CORBAORB,本文對此將不再做進一步的闡述。通過上面的講述相信大家一定對ActiveXOLECOM/DCOM的關係有了一個清楚的瞭解。

3.註冊ActiveX控制元件

使用Windows的人對於ActiveX控制一定不會陌生,它提供了一種類似於DLL動態連結庫的呼叫,不過它與DLL的唯一區別就是ActiveX不註冊不能被系統識別並使用。那麼,當我們得到一個ActiveX沒有被正確安裝且不能使用的訊息後,又要安裝ActiveX怎麼辦呢?

  1. Regsvr32程式法在WindowsSystem資料夾下有一個Regsvr32.exe的程式,它就是Windows自己帶的ActiveX註冊和反註冊工具。利用它也能夠非常方便地註冊ActiveX控制元件,它的用法為:
    regsvr32 /u /s /c /i /n dllname
    其中dllnameActiveX控制元件檔名,建議在安裝前拷貝到System資料夾下引數有如下意義:
    /u - 反註冊控制元件
    /s - 不管註冊成功與否,均不顯示提示框
    /c - 控制檯輸出
    /i - 跳過控制元件的選項進行安裝 (與註冊不同)
    /n - 不註冊控制元件,此選項必須與/i 選項一起使用.
    例如:筆者要註冊 amovie.ocx 控制元件,則打入regsvr32 amovie.ocx即可,
    要反註冊它時只需使用 regsvr32 /u amovie.ocx就行了。

  2. 登錄檔法所謂註冊ActiveX,無非是將一些資訊記錄在Windows的登錄檔中,如ShockwaveFlashObject控制元件,我們可以執行Regedit.exe登錄檔編輯程式,利用關鍵字進行搜尋,然後把搜尋得到後的登錄檔匯出為REG登錄檔檔案,再將其相應的ActiveX檔案拷貝到WindowsSystem資料夾(一般ActiveX的檔名為OCX,安裝在WindowsSystem資料夾內)下,最後在要安裝ActiveX的機器上雙擊匯入剛才匯出的登錄檔檔案即可完成安裝。

Activex,OLE,COM都是微軟的一些技術標準OLE比較老後來發展成Activex,再後來發展成為COM
OCXDLL是副檔名。 Activex有兩種副檔名OCXDLL。實際上你可以把它們的副檔名字調換。COM作為ActiveX的更新技術,副檔名也有可能是DLLDLL檔案還有可能是動態連結庫,主要是裝載一些函式,可以動態載入。

讚賞碼New