天天看點

dll和ocx的差別

ActiveX,OLE是基于COM的一種應用,其檔案字尾一般以dll和ocx結尾;ocx作為一種特殊的dll檔案,具有一定的使用者界面和事件響應,而dll檔案隻是方法和屬性的集合。

一、關于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為字尾名的檔案是一個包含函數和資料的子產品集合,可以被其它應用程式共享的程式子產品。