OCX和DLL的區別

来源:http://www.cnblogs.com/schumipush/archive/2016/05/28/5537655.html
-Advertisement-
Play Games

轉自:http://blog.csdn.net/scucj/archive/2006/06/29/852181.aspx OCX和DLL的區別 一、關於DLL的介紹 DLL,動態鏈接庫,Dynamic Link Library的縮寫,是一個包含函數和數據的模塊集合,可以被其它應用程式共用的程式模塊。 ...


 

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

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

---恢復內容結束---


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 現在很多用戶被資料庫的慢的問題所困擾,又苦於花錢請一個專業的DBA成本太高。軟體維護人員對資料庫的瞭解又不是那麼深入,所以導致問題遲遲不能解決,或只能暫時解決不能得到根治。開發人員解決數據問題基本又是搜遍百度各種方法嘗試個遍,可能錯過診斷問題的最佳時機又可能嘗試一堆方法最後無奈放棄。 怎麼樣讓瑣事纏 ...
  • 簡介: MongoDB是一個開源的文檔資料庫,支持高性能、高可用性、自動縮放。 在MongoDB中,一條記錄就是一個文檔,是由欄位和值對構成一個數據結構,類似於JSON對象。欄位的值可以包括其他文檔、數組和文檔的數組。 數據結構如下所示: mongodb中有三元素:資料庫,集合,文檔,其中“集合”就 ...
  • 創建表空間 create tablespace portal_data datafile'E:\OracleDB\System_TableSpace\portal_data01.dbf' size 512M ; create tablespace portal_idx datafile'E:\Ora ...
  • 首先安裝mongodb 1.下載地址:http://www.mongodb.org/downloads 2.解壓縮到自己想要安裝的目錄,比如d:\mongodb 3.創建文件夾d:\mongodb\data\db、d:\mongodb\data\log,分別用來安裝db和日誌文件,在log文件夾下創 ...
  • 使用mysql二進位方式連接 您可以使用MySQL二進位方式進入到mysql命令提示符下來連接MySQL資料庫。 實例 以下是從命令行中連接mysql伺服器的簡單實例: 在登錄成功後會出現 mysql> 命令提示視窗,你可以在上面執行任何 SQL 語句。 以上命令執行後,登錄成功輸出結果如下: 在以 ...
  • 先把student刪除,再重新插入數據 1、查詢指定鍵db.集合名稱.find({查詢條件},{指定鍵})指定鍵:1表示顯示,0表示不顯示,_id預設顯示 2、各種查詢方式$lt:<$lte:<=$gt:>$gte:>=$ne:!= $in:包含$nin:不包含 $or:或者 null:空值 $ty ...
  • 1.node和NPM是什麼? Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that make... ...
  • 1:用戶的shell歷史命令保存在home/username/.bash_history中 #!! 執行用戶的上一條命令 #!pw 執行命令歷史中最近一次以pw開頭的命令 2:'*'來匹配零或多個字元 '?’匹配一個字元 #ls -d Day* 列出Day開頭,後面匹配所有字元的目錄 #ls -d ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...