Activex、OLE、COM、OCX、DLL之間區別、聯絡[轉]

Simmy.臥龍先生發表於2016-01-07

轉自:http://baike.baidu.com/view/393671.htm

建立COM:http://blog.csdn.net/henry000/article/details/7008397#t9

概述

      .ocx是ocx控制元件的副檔名,與.exe .dll同屬於PE檔案。下面說說什麼是ocx控制元件!

  OCX 是物件類別擴充元件。

  如果你用過Visual Basic或者Delphi一類的視覺化程式設計工具,那麼對控制元件這個概念一定不會陌生,就是那些工具條上的小按鈕,如EditBox,Grid,ImageBox,Timer等等。每個控制元件都有自己的事件、方法和屬性。使用了控制元件的程式設計非常容易。首先,在程式的設計階段可以設定一些屬性,如大小,位置,標題(caption)等等;在程式執行階段,可以更改這些屬性,還可以針對不同的事件,呼叫不同的方法來實現對該控制元件的控制。控制元件就好像一塊塊的積木,程式要做的事只是將這些積木搭起來。控制元件的最大好處是可以重複使用,甚至可以在不同的程式語言之間使用,例如你可以在VB中嵌入用VC開發的控制元件。

詳細資訊

      控制元件的本質是微軟公司的物件連結和嵌入(OLE)標準。由於它充分利用了物件導向的優點,使得程式效率得到了很大的提高,從而得到了廣泛的應用。國外有很多公司就是專門製作各種各樣控制元件的。控制元件的最早形式是以.VBX的格式出現的,後來變成了.OCX。由於Internet的廣泛流行,微軟公司推出了ActiveX技術,就是從OLE發展起來的,加入了WWW上的功能。所以目前最流行的是ActiveX控制元件。

  ActiveX控制元件.ActiveX控制元件是可重用的軟體元件。使用它可以很快地在網址、臺式應用程式、以及開發工具中加入特殊的功能。ActiveX控制元件的使用者可以無需知道這些元件是如何開發的,便可以完成網頁或應用程式的設計。

  物件連結和嵌入使用者控制元件(OCX)是一種可以由在微軟的Windows系統中執行的應用軟體建立使用的特殊用途的程式。OCX提供操作滾動條移動和視窗恢復尺寸的功能。如果你有Windows系統,你會發現在你的Windows地址錄裡有大量OCX檔名字尾的檔案。 物件連結和嵌入(OLE)被設計來支援混合文件(包含多種資料型別,比如文字、繪畫影象、聲音、動畫)。Windows桌面就是一個混合文件的範例,微軟使用OLE來建立的。OLE和元件物件模型(COM繼OLE後的更常用的概念)支援“即插即用”程式的發展,“即插即用”程式在系統中可以用任何語言寫入並可以由任何應用程式動態地使用。這些程式被認為是他們在其上執行的container的組建和應用程式。這種基於元件的近似應用程ˉ序的發展縮減了程式除錯時間並改善了程式的效能和品質。Windows應用發展程式(比如powerbuilder和Microsoft Access)具有OCX的優勢。

OCX控制元件在WINDOWS XP中的註冊方式

      ocx控制元件的安裝方式有很多種,這裡介紹最簡單的一種。

  步驟:

  1.將需要安裝的OCX控制元件檔案複製到某個目錄,例如C盤根目錄下。

  2.進入開始,點選執行。

  3.在出現的框中鍵入regsvr32 C:/xxxx.ocx 。(XXXX為控制元件名, C:/為目錄)

  4.點選確認後等待出現提醒註冊成功即可。

  oca 檔案

  Oca檔案不是控制元件,其中儲存Ocx控制元件的屬性


///////////////////////////////////////////////////////////////////////////////////////////////////////////////

轉自:http://hi.baidu.com/yaolihui/blog/item/aa9cfcce91931e0192457eb5.html

        熟悉物件導向程式設計和網路程式設計的人一定對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的機器上雙擊匯入剛才匯出的登錄檔檔案即可完成安裝。

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

一、OCX元件的來歷是怎樣的?

一般的開發工具都會提供一些標準控制元件,但不管標準控制元件多麼強大、多麼完善,都不能完全滿足使用者的需要。所以易語言就提供一個介面,允許使用者編寫自己的控制元件插入到易語言中使用。使用者編寫自己的控制元件在使用方法上同標準控制元件是相同。按照易語言的介面標準編寫的控制元件就是OCX。由於使用OCX可以節省開發軟體的時間,所以現在幾乎所有開發工具都允許使用者使用OCX來增強其功能。後來隨著Internet的流行,微軟又讓網頁中可以嵌入OCX,並稱其為ActiveX控制元件。目前可以編寫OCX的工具包括VB、VC、Delphi。易語言也即將支援OCX。

二、OLE和OCX的關係是什麼?

OLE和OCX通稱物件連結與嵌入。易語言已通過超級連結框等實現很多物件的連結功能,物件的嵌入易語言也即將支援。
OLE與OCX的應用主要是源於將多個應用資訊源組合到一起的目標,OCX即將在易語言中得到廣泛的應用,因為它能更好的與易語言的應用程式相結合,從而實現易語言不好實現或是很難實現的功能。實際上,易語言本身以及Visual Basic等等其它程式會提供多處實現特定功能的OCX控制元件。通過它們,我們可以非常容易的實現一些易語言本身不能實現的功能。

三、控制元件與DLL的關係是什麼?

元件的前身是動態連結庫(DLL),DLL使我們能夠用一種語言開發一個可以用於任何其他語言的過程庫。DLL的另一個強大的功能是在執行期間被載入的,這使得我們能夠將開發任務劃分為一個個元件而不必開發並靜態連結一個大型應用程式。

四、什麼是ActiveX外掛(控制元件)?

根據微軟權威的軟體開發指南MSDN(Microsoft Developer Network)的定義,ActiveX外掛以前也叫做OLE控制元件或OCX控制元件,它是一些軟體元件或物件,可以將其插入到WEB網頁或其它應用程式中。 
ActiveX(COM)技術是一種嵌入式程式技術,它其實就是OLE和 OCX的融合。 ActiveX是Microsoft提出的一組使用COM(Component Object Model,部件物件模型)使得軟體部件在網路環境中進行互動的技術。 它與具體的程式語言無關。作為針對Internet應用開發的技術 ,ActiveX被廣泛應用於WEB伺服器以及客戶端的各個方面。同時,ActiveX技術也被用於方便地建立普通的桌面應用程式。在Applet中可以使用ActiveX技術 ,如直接嵌入 ActiveX控制,或者以ActiveX技術為橋樑,將其它開發商提供的多種語言的程 序物件整合到Java中。與Java的位元組碼技術相比,ActiveX提供了“程式碼簽名 ”(Code Signing)技術保證其安全性。
ActiveX是Microsoft的元素軟體標準。簡單地說,ActiveX技術是一種共享程式資料和功能的技術。它由微軟提出並大力推廣,並已成為事實上的標準。

ActiveX技術是Microsoft對OLE技術的更新和發展,Microsoft公司為了適應網路的高速發展把它的OLE技術和OCX技術融為一體並加以改進形成聯合標準,改進之後賦予新名字ActiveX。也就是說,ActiveX中涵蓋了OLE的所有技術和功能,同時又具有許多新的特性,以適應網路發展的需要。

ActiveX指的是一組包括控制元件、DLL和ActiveX文件的元件,它通常以動態連結庫的形式存在,其設計思想是將一個程式(比如Flash動畫)嵌入到另一個程式中(這個程式通常被稱做容器,比如Authorware、Delphi、VB、VC、Internet Explorer等)。藉助這種技術使得使用者在一個程式中所建立的資訊可以被整合到其它程式所產生的文件中。.這樣就可使它(如Flash動畫)可以隨意地應用到各種場合。

ActiveX控制元件的資料輸入和函式功能執行都必須通過容器,因此ActiveX控制元件和容器之間必須有一些特定的介面協議。ActiveX控制元件必須具備如下的效能機制:

屬性和方法:ActiveX控制元件必須提供屬性的名稱、方法的名稱及引數,通過這項機制,容器可以存取和改變ActiveX控制元件的屬性引數。

事件:ActiveX控制元件由這項機制通知容器在ActiveX控制元件中發生的事件,比如屬性引數的改變,使用者按下滑鼠左鍵等。

雖然在本質上ActiveX和OLE是同一種技術(實現不同程式的資料和功能的共享),但其目的有所差別。ActiveX的目的主要是共享程式模組之間的計算功能,生成一些專門的可以嵌入其他程式中的“小程式”,例如Microsoft web瀏覽器控制元件可以使得別的應用程式能夠瀏覽(僅僅是瀏覽而不是建立)Web網頁。

ActiveX控制元件是一個模組化的靈活物件,如果某個應用程式或網頁需要增加一項特殊的功能,則無須重寫整個程式,只要靈活地插入一個具有此項功能的ActiveX控制元件即可實現,ActiveX的優勢還在於它的動態可互動性,使用者可以動態地在使用過程中,通過改變它的屬性和引數,在應用程式中實現自己的特殊要求。


五、什麼是COM?

為了提供使物件能夠與主應用程式通訊的一種標準,微軟原來引入了物件連結和嵌入(OLE)。原來規範的目標是提供一種途徑,使應用程式,如Excel能夠將電子表格嵌入到其他支援OLE標準的應用程式中。那時,人們認識到,OLE支援一種技術的基礎,這種技術使得能夠共享類屬的物件,即元件物件模型(COM)。這種概念用於為OCX元件建立一種元件規範。這將我們帶到了當前的標準ActiveX和ActiveX控制元件,OLE和OCX的發展最終形成了COM的頂尖產物。

可以將COM看作是在兩塊程式碼之間共享元件的二進位制標準。COM根據物件可以完成的功能使得物件實現抽象化。物件可以完成的功能在其介面部分描述。介面就是物件可以實現的一組在邏輯上相關功能的訪問方法。每個物件都擁有一個唯一的類ID(CLSID),它使用任意的一組介面。所有類必須具有IUNKNOWN介面,這個介面又可以被用於訪問這個類支援的任何介面。這是一種功能強大的物件模型,因為它使應用程式能夠在執行過程中確定任意一個物件是否可以完成某一項任務。

COM物件是通過幾個方法來實現的。可以將COM物件編譯成DLL或OCX,它們可以與呼叫應用程式在相同的程式空間中執行。COM物件還可以象編譯過的可執行檔案一樣在它自己的程式空間中執行。利用分散式COM(DCOM),物件可以執行在不同的機器上,即可以執行在世界的任何位置。儘管COM物件的實現程式碼可能處於不同的程式中或不同的機器上,但COM物件系統服務去除了呼叫COM物件的複雜性。ActiveX元件是COM物件,這些物件實現了一套基本的介面,使元件能夠被嵌入到可以主控ActiveX元件的應用程式中去。

六、OLE與COM的關係是什麼?

元件物件模型COM(Component Object Model)是OLE的心臟,它不但提供了一個實現OLE的框架,還為一整類新軟體提出了一種全新的設計思想。它是一種物件導向的結構,定義了一套物件間相互通訊的標準方式,規定了如何使一些小的、定義良好的軟體模組在系統中共存並充分地相互作用。依照這種結構,可以將若干元件組合起來,以建立更大的和更復雜的系統。

七、ActiveX的來歷是怎樣的?

ActiveX的演變最早可以回溯到早期的剪下和貼上以及後來的OLE(Object Link and Ember——物件的連結與嵌入)技術。實質上,ActiveX已經不僅僅是一個技術上的問題,而是微軟的整個Internet戰略的中心環節。微軟把它的OLE和OCX技術融為一體並加以改進,將所形成的聯合標準命名為ActiveX。ActiveX把控制元件規範得更加精練,使得這些控制元件更加小巧而且效率更高,同時加強了其介面對資料和特性的管理。ActiveX可以幫助應用程式開發者、Web網頁製作者建立動態的Internet工具、網頁和站點。
實際上可以將Microsoft提供的ActiveX控制元件看成是一個小的應用程式庫。這些小程式對外提供介面,可以編寫指令碼語言(如用Vbscript等語言編寫)並對其進行控制,這樣就能使網頁更加生動。

八、OLE控制元件的宗旨是什麼?

OLE控制元件的思想在於:開發出即插即用的可重複利用的程式碼,使第三方使用者開發的控制元件很容易在自己的開發環境中得到應用。它的實質就是,用現有構件(控制元件)構造程式,即構件式軟體。

九、物件嵌入(OCX)通俗的叫法是什麼?

我們平常所說的視窗套視窗就是物件嵌入的一種。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

轉自:http://blog.csdn.net/scucj/archive/2006/06/29/852181.aspx

一、關於DLL的介紹
 
    DLL,動態連結庫,Dynamic Link Library的縮寫,是一個包含函式和資料的模組集合,可以被其它應用程式共享的程式模組。DLL作為共享函式庫的可執行檔案,封裝了一個或多個已被編譯、連結的函式。多個程式可以同時使用一個 DLL,在記憶體中共享該 DLL 的一個副本。DLL 還有助於共享資料和資源。   它和可執行檔案(.EXE檔案)非常類似,他們的區別在於 DLL 中雖然包含了可執行程式碼卻不能單獨執行,只能由需要使用它的應用程式來直接或間接調。[1]

    通俗的說,在Windows作業系統中,許多應用程式並不是一個完整的可執行檔案,它們的正確執行需要呼叫一些相對獨立的動態連結庫,即DLL檔案。一個應用程式可以呼叫多個DLL檔案,一個DLL檔案也可能被幾個應用程式所共用,這樣的DLL檔案被稱為共享 DLL 檔案。[2]DLL 檔案一般被存在C:/Windows/System 目錄下,也可能放在應用程式所在的目錄或是子目錄中。

   提到動態連結,先說明一下靜態連線。什麼是靜態連線呢?在程式連結的過程中,需要將編譯後的二進位制程式碼連結成目的碼,連結器從靜態連結庫中獲得所有被引用的函式,並將這些被引用的函式同程式碼一起放到可執行檔案中。那麼關於 DLL 的靜態連線則是指連結器將被引用的庫函式的程式碼複製到呼叫 DLL 的可執行模組(.dll 檔案或 .exe 檔案)中。

  什麼是動態連結呢?動態連結是系統允許可執行模組(.dll 檔案或 .exe 檔案)在執行程中,只需要包含在定位 DLL 函式的可執行程式碼所需的資訊。換句話說,可執行模組(.dll 檔案或 .exe 檔案)在執行時載入這些模組(亦即所需的模組對映到呼叫程式的地址空間)。[3]

   那麼動態連結和靜態連線 相比,優點有哪些呢?

    (1)節省記憶體,減少交換操作。使用動態連結,多個程式可以同時使用一個 DLL,在記憶體中共享該 DLL 的一個副本。使用靜態連結,每個應用程式都包含被引用的庫函式的程式碼,那麼Windows 必須在記憶體中為每個應用程式載入引用的庫函式的程式碼的一個副本。 
    (2)節省磁碟空間。使用動態連結,在磁碟上僅需要 DLL 的一個副本。使用靜態連結,每個應用程式都包含被引用的庫函式的程式碼。 
    (3)更易於升級。使用動態連結,DLL 中的函式發生變化時,只要函式的引數和返回值沒有更改,就不需重新編譯或重新連結使用它們的應用程式。使用靜態連結,在函式發生變化時,需要重新連結來生成應用程式。
    (4)支援多語言程式,只要程式遵循函式的呼叫約定,用不同程式語言編寫的程式就可以呼叫相同的DLL 函式。
    (5)提供擴充套件 MFC 庫類的機制。可以從現有 MFC 類派生類,並將它們放到 MFC 擴充套件 DLL 中供 MFC應用程式使用。 
    (6)支援多語言程式,並使國際版本的建立輕鬆完成。通過將資源放到 DLL 中,建立應用程式的國際版本變得容易得多。可將用於應用程式的每個語言版本的字串放到單獨的 DLL 資原始檔中,並使不同的語言版本載入合適的資源。[4]

  DLL 中包含下面兩類函式的定義: 
  匯出函式:這些函式由可執行模組(.dll 檔案或 .exe 檔案)呼叫。
  內部函式:這些函式僅從定義它們的 DLL 中呼叫。DLL 還匯出資料。不過,這些資料由相應的函式使用。

   可以通過下列方式呼叫 DLL 中的函式:  
    載入時動態連結:可執行模組執行顯式呼叫以匯出 DLL 函式。為 DLL 建立匯入庫,然後將 DLL 連結到應用程式。在載入應用程式時,匯入庫提供載入 DLL 和查詢匯出的 DLL 函式所需的資訊。
    執行時動態連結:在執行時載入 DLL 時,可執行模組使用 LoadLibrary 函式或 LoadLibraryEx 函式。可執行模組呼叫 GetProcAddress 函式以獲取匯出的 DLL 函式的地址。在連結時,Windows 搜尋預安裝的一組 DLL,例如效能庫 (Kernel32.dll) 和安全庫 (User32.dll)。然後,Windows 按以下順序搜尋DLL: 
1.當前程式的可執行程式所在的目錄。
2.當前目錄。
3.Windows 系統目錄。(GetSystemDirectory 函式獲取 Windows 系統目錄的路徑。)
4.Windows 目錄。(GetWindowsDirectory 函式獲取 Windows 目錄的路徑。)
5.PATH 環境變數中列出的目錄。注意:LIBPATH 環境變數不用於搜尋。[3]

    DLL 有一個特殊的入口點(DllMain 函式),它在附加和分離程式和執行緒時執行。此行為允許根據需要建立和銷燬資料結構。副檔名為 .ocx、.cpl 和 .drv 的檔案型別也是 DLL,儘管副檔名已改變。
    您可以通過建立 DLL 實現以下目的:
    (1)將程式劃分為可按需載入的單獨模組。 
    (2)儲存特定於語言或特定於區域的資源。 
    (3)使您自己的應用程式能夠使用核心程式碼庫。 
    (4)生成程式內 COM 物件或 ActiveX 控制元件 (OCX)。 
    (5)將 OLE 物件用作程式內 DLL。這一用法可改進 OLE 連結的效能。 
    (6)使用控制皮膚擴充套件或使用某些型別的驅動程式。 [3]

二、關於以.ocx為字尾名的ActiveX控制元件

    剛才提到過,副檔名為 .ocx、.cpl 和 .drv 的檔案型別也是 DLL。

    現在的ActiveX 控制元件等價與以前的OLE控制元件或OCX,一個典型的控制元件包括設計時和執行時的使用者介面,唯一的IDispatch介面定義了控制元件的屬性和方法,唯一的 IConnectionPoint介面定義控制元件可引發的事件。一個控制元件可以在容器中執行,所以從執行的角度看它類似與一個DLL。[5]

    儘管 ActiveX 和 OLE 都基於組建物件模型(Component Object Model,COM),它們為程式設計師提供的卻是截然不同的服務。COM提供的是低階的物件捆綁機制,該機制支援物件之間的互動通訊。OLE使用COM來提供低階的應用服務,例如採用連線和嵌入機制,支援使用者建立複合文件。與之不同,ActiveX提供更精細的結構,用以支援在網路站點上嵌入控制元件,以及對事件的互動反應。優化ActiveX,目的是為了提高時間和空間效率,而優化OLE,是為了便於終端使用者的使用和整合臺式系統的應用程式。ActiveX還為Internet技術帶來了一些技術上的變革,例如,ActiveX大大減小了程式碼量(程式碼量減少了百分之五十到七十),支援更多的提交和非同步連線。 [6]

   ActiveX的基礎是OLE和COM,但是通過MS的各種開發工具可以遮蔽掉COM模型中許多另人費解的技術細節。ActiveX元件技術包括以下一些方面:(1)自動化伺服器 (2)自動化控制器 (3)控制元件 (4)COM物件 (5)文件 (6)容器 。

   以.ocx為字尾名的ActiveX控制元件主要應用在WEB上和Window Forms程式開發上。應用程式使用ActiveX/COM元件來擴充套件自身的業務邏輯、事務處理和應用服務的範圍。

   順便提一下以.ocx為字尾名的ActiveX控制元件的註冊和解除安裝方法,在“開始”選單的“執行”輸入以下程式碼完成任務:
    regsvr32 path & "/xxx.ocx" '註冊
    regsvr32 /u path & "/xxx.ocx" '解除安裝

    其中path代表該xxx.ocx所以在的目錄的路徑。

三、OCX和DLL的區別

   以.ocx為字尾名的ActiveX控制元件是一種比較特殊的DLL,它的基礎是OLE和COM,是有互動介面的視覺化控制元件,定義了控制元件的屬性和方法,定義控制元件可引發的事件的響應。我們通常說的.DLL為字尾名的檔案是一個包含函式和資料的模組集合,可以被其它應用程式共享的程式模組。


本文引用:
[1]http://zhouyi2.jblog.cn/120494.shtml
[2]http://www.symood.com/Article/ShowArticle.asp?ArticleID=197
[3]http://www.jr163.org/cup2/54/54294.htm
[4]MSDN:DLL
[5]http://www.blog.edu.cn/user2/eliming/archives/2006/1127399.shtml
[6]http://www.symood.com/Article/ShowArticle.asp?ArticleID=198

 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

轉自:http://blog.csdn.net/effective100/archive/2008/12/21/3567922.aspx

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快。

 

相關文章