[科普]Activex、OLE、COM、OCX、DLL
原創文章,歡迎轉載。轉載請註明:轉載自 祥的部落格
1. 基礎
熟悉面向物件程式設計和網路程式設計的人一定對ActiveX
、OLE
和COM/DCOM
這些概念不會陌生,但是它們之間究竟是什麼樣的關係,對許多們還是比較模糊的。在具體介紹它們的關係之間,我們還是先明確元件(Component)
和物件(Object)
之間的區別。
元件
是一個可重用的模組
,它是由一組處理過程、資料封裝和使用者介面組成的業務物件(Rules Object)
。元件看起來像物件,但不符合物件的學術定義。它們的主要區別
是:
元件
可以在另一個稱為容器
(有時也稱為承載者或宿主)的應用程式中使用,也可以作為獨立過程使用;元件
可以由一個類
構成,也可以由多個類
組成,或者是一個完整的應用程式
;元件
為模組重用,而物件
為程式碼重用。現在,比較流行的元件模型有COM
(Component Objiect Module
,物件元件模型)/DCOM
(Distributed COM
,分散式物件元件模型)和ORBA
(Common Object Request Broker Architecture
,公共物件請求代理體系結構)。
到這裡,已經出現了與本文相關的主題COM
,而CORBA
與本文無關,就不作介紹。之所以從元件與物件的區別說起,是想讓大家明確 COM
和 CORBA
是處在整個體系結構的最底層,如果暫時對此還不能理解,不妨繼續往下看,最後在回過頭看一看就自然明白了。
2.關係
現在開始闡述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
的關係有了一個清楚的瞭解。
3.註冊ActiveX控制元件
使用Windows
的人對於ActiveX
控制一定不會陌生,它提供了一種類似於DLL
動態連結庫的呼叫,不過它與DLL
的唯一區別就是ActiveX
不註冊不能被系統識別並使用。那麼,當我們得到一個ActiveX
沒有被正確安裝且不能使用的訊息後,又要安裝ActiveX
怎麼辦呢?
Regsvr32
程式法在Windows
的System
資料夾下有一個Regsvr32.exe
的程式,它就是Windows
自己帶的ActiveX註冊和反註冊工具
。利用它也能夠非常方便地註冊ActiveX控制元件
,它的用法為:
regsvr32 /u /s /c /i /n dllname
其中dllname
為ActiveX控制元件
檔名,建議在安裝前拷貝到System
資料夾下引數有如下意義:
/u
- 反註冊控制元件
/s
- 不管註冊成功與否,均不顯示提示框
/c
- 控制檯輸出
/i
- 跳過控制元件的選項進行安裝 (與註冊不同)
/n
- 不註冊控制元件,此選項必須與/i 選項一起使用.
例如:筆者要註冊amovie.ocx
控制元件,則打入regsvr32 amovie.ocx
即可,
要反註冊它時只需使用regsvr32 /u amovie.ocx
就行了。登錄檔法所謂註冊
ActiveX
,無非是將一些資訊記錄在Windows的登錄檔中,如ShockwaveFlashObject
控制元件,我們可以執行Regedit.exe
登錄檔編輯程式,利用關鍵字進行搜尋,然後把搜尋得到後的登錄檔匯出為REG登錄檔檔案
,再將其相應的ActiveX檔案
拷貝到Windows
的System
資料夾(一般ActiveX
的檔名為OCX
,安裝在Windows
的System
資料夾內)下,最後在要安裝ActiveX
的機器上雙擊匯入剛才匯出的登錄檔檔案即可完成安裝。
Activex
,OLE
,COM
都是微軟的一些技術標準
。OLE
比較老後來發展成Activex
,再後來發展成為COM
。
OCX
,DLL
是副檔名。 Activex
有兩種副檔名OCX
和DLL
。實際上你可以把它們的副檔名字調換。COM
作為ActiveX
的更新技術,副檔名也有可能是DLL
。DLL
檔案還有可能是動態連結庫,主要是裝載一些函式,可以動態載入。