轉(zhuǎn)自:http://blog.csdn.net/scucj/archive/2006/06/29/852181.aspx???

          OCX和DLL的區(qū)別

          一、關(guān)于DLL的介紹
          ?
          ??? DLL,動態(tài)鏈接庫,Dynamic Link Library的縮寫,是一個包含函數(shù)和數(shù)據(jù)的模塊集合,可以被其它應(yīng)用程序共享的程序模塊。DLL作為共享函數(shù)庫的可執(zhí)行文件,封裝了一個或多個已被編譯、鏈接的函數(shù)。多個進(jìn)程可以同時使用一個 DLL,在內(nèi)存中共享該 DLL 的一個副本。DLL 還有助于共享數(shù)據(jù)和資源。?? 它和可執(zhí)行文件(.EXE文件)非常類似,他們的區(qū)別在于 DLL 中雖然包含了可執(zhí)行代碼卻不能單獨執(zhí)行,只能由需要使用它的應(yīng)用程序來直接或間接調(diào)。[1]

          ??? 通俗的說,在Windows操作系統(tǒng)中,許多應(yīng)用程序并不是一個完整的可執(zhí)行文件,它們的正確執(zhí)行需要調(diào)用一些相對獨立的動態(tài)鏈接庫,即DLL文件。一個應(yīng)用程序可以調(diào)用多個DLL文件,一個DLL文件也可能被幾個應(yīng)用程序所共用,這樣的DLL文件被稱為共享 DLL 文件。[2]DLL 文件一般被存在C:\Windows\System 目錄下,也可能放在應(yīng)用程序所在的目錄或是子目錄中。

          ?? 提到動態(tài)鏈接,先說明一下靜態(tài)連接。什么是靜態(tài)連接呢?在程序鏈接的過程中,需要將編譯后的二進(jìn)制代碼鏈接成目標(biāo)代碼,鏈接器從靜態(tài)鏈接庫中獲得所有被引用的函數(shù),并將這些被引用的函數(shù)同代碼一起放到可執(zhí)行文件中。那么關(guān)于 DLL 的靜態(tài)連接則是指鏈接器將被引用的庫函數(shù)的代碼復(fù)制到調(diào)用 DLL 的可執(zhí)行模塊(.dll 文件或 .exe 文件)中。

          ? 什么是動態(tài)鏈接呢?動態(tài)鏈接是系統(tǒng)允許可執(zhí)行模塊(.dll 文件或 .exe 文件)在運行程中,只需要包含在定位 DLL 函數(shù)的可執(zhí)行代碼所需的信息。換句話說,可執(zhí)行模塊(.dll 文件或 .exe 文件)在運行時加載這些模塊(亦即所需的模塊映射到調(diào)用進(jìn)程的地址空間)。[3]

          ?? 那么動態(tài)鏈接和靜態(tài)連接 相比,優(yōu)點有哪些呢?

          ??? (1)節(jié)省內(nèi)存,減少交換操作。使用動態(tài)鏈接,多個進(jìn)程可以同時使用一個 DLL,在內(nèi)存中共享該 DLL 的一個副本。使用靜態(tài)鏈接,每個應(yīng)用程序都包含被引用的庫函數(shù)的代碼,那么Windows 必須在內(nèi)存中為每個應(yīng)用程序加載引用的庫函數(shù)的代碼的一個副本。
          ??? (2)節(jié)省磁盤空間。使用動態(tài)鏈接,在磁盤上僅需要 DLL 的一個副本。使用靜態(tài)鏈接,每個應(yīng)用程序都包含被引用的庫函數(shù)的代碼。
          ??? (3)更易于升級。使用動態(tài)鏈接,DLL 中的函數(shù)發(fā)生變化時,只要函數(shù)的參數(shù)和返回值沒有更改,就不需重新編譯或重新鏈接使用它們的應(yīng)用程序。使用靜態(tài)鏈接,在函數(shù)發(fā)生變化時,需要重新鏈接來生成應(yīng)用程序。
          ??? (4)支持多語言程序,只要程序遵循函數(shù)的調(diào)用約定,用不同編程語言編寫的程序就可以調(diào)用相同的DLL 函數(shù)。
          ??? (5)提供擴(kuò)展 MFC 庫類的機(jī)制。可以從現(xiàn)有 MFC 類派生類,并將它們放到 MFC 擴(kuò)展 DLL 中供 MFC應(yīng)用程序使用。
          ??? (6)支持多語言程序,并使國際版本的創(chuàng)建輕松完成。通過將資源放到 DLL 中,創(chuàng)建應(yīng)用程序的國際版本變得容易得多。可將用于應(yīng)用程序的每個語言版本的字符串放到單獨的 DLL 資源文件中,并使不同的語言版本加載合適的資源。[4]

          ? DLL 中包含下面兩類函數(shù)的定義:?
          ? 導(dǎo)出函數(shù):這些函數(shù)由可執(zhí)行模塊(.dll 文件或 .exe 文件)調(diào)用。
          ? 內(nèi)部函數(shù):這些函數(shù)僅從定義它們的 DLL 中調(diào)用。DLL 還導(dǎo)出數(shù)據(jù)。不過,這些數(shù)據(jù)由相應(yīng)的函數(shù)使用。

          ?? 可以通過下列方式調(diào)用 DLL 中的函數(shù):??
          ??? 加載時動態(tài)鏈接:可執(zhí)行模塊執(zhí)行顯式調(diào)用以導(dǎo)出 DLL 函數(shù)。為 DLL 創(chuàng)建導(dǎo)入庫,然后將 DLL 鏈接到應(yīng)用程序。在加載應(yīng)用程序時,導(dǎo)入庫提供加載 DLL 和查找導(dǎo)出的 DLL 函數(shù)所需的信息。
          ??? 運行時動態(tài)鏈接:在運行時加載 DLL 時,可執(zhí)行模塊使用 LoadLibrary 函數(shù)或 LoadLibraryEx 函數(shù)。可執(zhí)行模塊調(diào)用 GetProcAddress 函數(shù)以獲取導(dǎo)出的 DLL 函數(shù)的地址。在鏈接時,Windows 搜索預(yù)安裝的一組 DLL,例如性能庫 (Kernel32.dll) 和安全庫 (User32.dll)。然后,Windows 按以下順序搜索DLL:
          1.當(dāng)前進(jìn)程的可執(zhí)行程序所在的目錄。
          2.當(dāng)前目錄。
          3.Windows 系統(tǒng)目錄。(GetSystemDirectory 函數(shù)獲取 Windows 系統(tǒng)目錄的路徑。)
          4.Windows 目錄。(GetWindowsDirectory 函數(shù)獲取 Windows 目錄的路徑。)
          5.PATH 環(huán)境變量中列出的目錄。注意:LIBPATH 環(huán)境變量不用于搜索。[3]

          ??? DLL 有一個特殊的入口點(DllMain 函數(shù)),它在附加和分離進(jìn)程和線程時運行。此行為允許根據(jù)需要創(chuàng)建和銷毀數(shù)據(jù)結(jié)構(gòu)。文件擴(kuò)展名為 .ocx、.cpl 和 .drv 的文件類型也是 DLL,盡管文件擴(kuò)展名已改變。
          ??? 您可以通過創(chuàng)建 DLL 實現(xiàn)以下目的:
          ??? (1)將程序劃分為可按需加載的單獨模塊。?
          ??? (2)存儲特定于語言或特定于區(qū)域的資源。?
          ??? (3)使您自己的應(yīng)用程序能夠使用核心代碼庫。?
          ??? (4)生成進(jìn)程內(nèi) COM 對象或 ActiveX 控件 (OCX)。?
          ??? (5)將 OLE 對象用作進(jìn)程內(nèi) DLL。這一用法可改進(jìn) OLE 鏈接的性能。?
          ??? (6)使用控制面板擴(kuò)展或使用某些類型的驅(qū)動程序。 [3]

          二、關(guān)于以.ocx為后綴名的ActiveX控件

          ??? 剛才提到過,文件擴(kuò)展名為 .ocx、.cpl 和 .drv 的文件類型也是 DLL。

          ??? 現(xiàn)在的ActiveX 控件等價與以前的OLE控件或OCX,一個典型的控件包括設(shè)計時和運行時的用戶界面,唯一的IDispatch接口定義了控件的屬性和方法,唯一的 IConnectionPoint接口定義控件可引發(fā)的事件。一個控件可以在容器中運行,所以從運行的角度看它類似與一個DLL。[5]

          ??? 盡管 ActiveX 和 OLE 都基于組建對象模型(Component Object Model,COM),它們?yōu)槌绦騿T提供的卻是截然不同的服務(wù)。COM提供的是低級的對象捆綁機(jī)制,該機(jī)制支持對象之間的交互通訊。OLE使用COM來提供低級的應(yīng)用服務(wù),例如采用連接和嵌入機(jī)制,支持用戶創(chuàng)建復(fù)合文檔。與之不同,ActiveX提供更精細(xì)的結(jié)構(gòu),用以支持在網(wǎng)絡(luò)站點上嵌入控件,以及對事件的交互反應(yīng)。優(yōu)化ActiveX,目的是為了提高時間和空間效率,而優(yōu)化OLE,是為了便于終端用戶的使用和集成臺式系統(tǒng)的應(yīng)用程序。ActiveX還為Internet技術(shù)帶來了一些技術(shù)上的變革,例如,ActiveX大大減小了代碼量(代碼量減少了百分之五十到七十),支持更多的提交和異步連接。 [6]

          ?? ActiveX的基礎(chǔ)是OLE和COM,但是通過MS的各種開發(fā)工具可以屏蔽掉COM模型中許多另人費解的技術(shù)細(xì)節(jié)。ActiveX組件技術(shù)包括以下一些方面:(1)自動化服務(wù)器 (2)自動化控制器 (3)控件 (4)COM對象 (5)文檔 (6)容器 。

          ?? 以.ocx為后綴名的ActiveX控件主要應(yīng)用在WEB上和Window Forms程序開發(fā)上。應(yīng)用程序使用ActiveX/COM組件來擴(kuò)展自身的業(yè)務(wù)邏輯、事務(wù)處理和應(yīng)用服務(wù)的范圍。

          ?? 順便提一下以.ocx為后綴名的ActiveX控件的注冊和卸載方法,在“開始”菜單的“運行”輸入以下代碼完成任務(wù):
          ??? regsvr32 path & "\xxx.ocx" '注冊
          ??? regsvr32 /u path & "\xxx.ocx" '卸載

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

          三、OCX和DLL的區(qū)別

          ?? 以.ocx為后綴名的ActiveX控件是一種比較特殊的DLL,它的基礎(chǔ)是OLE和COM,是有交互界面的可視化控件,定義了控件的屬性和方法,定義控件可引發(fā)的事件的響應(yīng)。我們通常說的.DLL為后綴名的文件是一個包含函數(shù)和數(shù)據(jù)的模塊集合,可以被其它應(yīng)用程序共享的程序模塊。

          posted on 2009-05-06 16:34 -274°C 閱讀(18173) 評論(0)  編輯  收藏 所屬分類: C++

          常用鏈接

          留言簿(21)

          隨筆分類(265)

          隨筆檔案(242)

          相冊

          JAVA網(wǎng)站

          關(guān)注的Blog

          搜索

          •  

          積分與排名

          • 積分 - 914173
          • 排名 - 40

          最新評論

          主站蜘蛛池模板: 东城区| 墨竹工卡县| 巴林右旗| 鄱阳县| 寿光市| 全南县| 东乡族自治县| 夏河县| 四子王旗| 罗甸县| 保德县| 三台县| 堆龙德庆县| 北安市| 靖江市| 昭平县| 重庆市| 丰镇市| 云和县| 霍山县| 台安县| 泉州市| 诸暨市| 黄大仙区| 观塘区| 洪江市| 东莞市| 松溪县| 扎兰屯市| 玉龙| 常德市| 布尔津县| 芦山县| 曲沃县| 宁陕县| 喀喇沁旗| 三台县| 嘉峪关市| 栖霞市| 柳江县| 资源县|