ocx控件與dll區別

ctiveX,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為後綴名的文件是一個包含函數和數據的模塊集合,可以被其它應用程序共享的程序模塊。

OCX需要一個載體,但DLL不需要。

OCX是一個對象類擴展;它是一種可執行文件,但不能直接執行;;是OCX控件的擴展。

DLL是動態鏈接庫的縮寫,意思是動態鏈接庫。在Windows中,很多應用程序並不是一個完整的可執行文件,它們被分割成一些相對獨立的動態鏈接庫,也就是DLL文件,並放置在系統中。

OCX

對象類別擴充組件
OCX 是對象類別擴充組件(Object Linking and Embedding (OLE) Control Extension);是可執行的文件的一種,但不可直接被執行; 是 ocx 控件的擴展名,與 .exe、.dll 同屬於PE文件。
如果你用過 Visual Basic 或者 Delphi 一類的可視化編程工具,那麼對控件這個概念一定不會陌生,就是那些工具條上的小按鈕,如 EditBox,Grid,ImageBox,Timer 等等。每個控件都有自己的事件、方法和屬性。
使用了控件的編程非常容易。在程序的設計階段可以設置一些屬性,如大小,位置,標題(caption)等等,在程序運行階段,可以更改這些屬性,還可以針對不同的事件,調用不同的方法來實現對該控件的控制。控件就好像一塊塊的積木,程序要做的事只是將這些積木搭起來。控件的最大好處是可以重複使用,甚至可以在不同的編程語言之間使用,例如,你可以在 VB 中嵌入用 VC 開發的控件。

註冊方式

ocx控件的安裝方式有很多種,這裡介紹最簡單的一種。
步驟:
1.進入開始,點擊運行。
2.在出現的框中鍵入regsvr32 C:\xxxx.ocx 。(XXXX為控件名, C:\為目錄))(regsvr32E:\控件的製作\myOcxTest\Debug\myOcxTest.ocx)
3.點擊確認後等待出現提醒註冊成功即可。
oca 文件
Oca文件不是控件,其中保存Ocx控件的屬性
ocx的註銷
1.進入開始,點擊運行。
2.在出現的框中鍵入regsvr32 /u C:\xxxx.ocx 。(XXXX為控件名, C:\為目錄)(regsvr32 /u E:\控件的製作\myOcxTest\Debug\myOcxTest.ocx)
3.點擊確認後等待出現提醒註銷成功即可。

到此這篇關於電腦中擴展名dll和ocx文件的區別的文章就介紹到這了,更多相關ocx控件與dll區別內容請搜索以前的文章或繼續瀏覽下面的相關文章,希望大家以後多多支持!

原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/172338.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
簡單一點的頭像簡單一點
上一篇 2024-11-22 04:09
下一篇 2024-11-22 04:09

相關推薦

  • 如何使用AutoHotkey調用DLL

    本文將從多個方面詳細講解如何使用AutoHotkey調用DLL。 一、AutoHotkey調用DLL的基礎知識 AutoHotkey作為一個已經非常成熟的自動化工具,它的腳本語言非…

    編程 2025-04-27
  • Node.js調用DLL詳解

    Node.js是一個開源、跨平台的JavaScript運行環境,它能夠讓JavaScript代碼在服務器端運行。在Node.js中調用DLL,可以讓JavaScript訪問一些高效…

    編程 2025-04-24
  • 深入解析msvcp90.dll

    一、MSVCP90.DLL概述 MSVCP90.DLL是Microsoft C++運行庫,它是Visual Studio 2008的一部分,提供了在64位Windows系統上運行C…

    編程 2025-04-24
  • Java調用DLL詳解

    一、JNI調用DLL Java Native Interface(JNI)是Java語言的一種機制,允許Java應用程序在JVM上調用本地(C或C++)應用程序。為了調用DLL,必…

    編程 2025-02-17
  • Java DLL詳解

    一、Java DLL基本概念 Java DLL,即Java動態鏈接庫,是一種具有獨立於操作系統、面向跨語言調用的特點的動態鏈接庫。 Java DLL內部封裝有Java程序代碼,可以…

    編程 2025-02-05
  • php模塊dll,php模塊緩存

    本文目錄一覽: 1、php環境出現了php_zip.dll-找不到指定的模塊 2、PHP如何調用.dll文件呀 3、PHP的擴展模塊怎麼添加? 4、php怎麼調用 dll動態庫 p…

    編程 2025-01-11
  • eom.dll詳細介紹

    一、簡介 eom.dll是360安全衛士的插件之一,它能夠實現瀏覽器的網頁推薦、文件下載等功能,是360安全衛士的重要組成部分。 在當前互聯網時代,安全成為了互聯網領域的一個重要話…

    編程 2025-01-11
  • phpmbstring.dll,php_mbstringdll

    本文目錄一覽: 1、無法啟動此程序,因為計算機中丟失 php_mbstring.dll.嘗試重新安裝該程序以解決此問題? 2、如何為已安裝php擴展安裝mbstring 3、為什麼…

    編程 2025-01-09
  • mysql.dll,mysqldll語句

    本文目錄一覽: 1、mysql.dll 放在c盤哪裡 2、c#怎樣加載mysql.dll 3、關於mysql找不到mysql.dll的問題,求高手,在線等!! mysql.dll …

    編程 2025-01-03

發表回復

登錄後才能評論