程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> DLL(Dynamic Linkable Library) 詳講解明

DLL(Dynamic Linkable Library) 詳講解明

編輯:更多關於編程

DLL(Dynamic Linkable Library) 詳講解明。本站提示廣大學習愛好者:(DLL(Dynamic Linkable Library) 詳講解明)文章只能為提供參考,不一定能成為您想要的結果。以下是DLL(Dynamic Linkable Library) 詳講解明正文


比擬大的使用順序都由很多模塊組成,這些模塊辨別完成絕對獨立的功用,它們彼此協作來完成整個軟件零碎的任務。能夠存在一些模塊的功用較為通用,在結構其它軟件零碎時仍會被運用。在結構軟件零碎時,假如將一切模塊的源代碼都靜態編譯到整個使用順序 EXE 文件中,會發生一些問題:一個缺陷是添加了使用順序的大小,它會占用更多的磁盤空間,順序運轉時也會耗費較大的內存空間,形成零碎資源的糜費;另一個缺陷是,在編寫大的 EXE 順序時,在每次修正重建時都必需調整編譯一切源代碼,添加了編譯進程的復雜性,也不利於階段性的單元測試。

Windows 零碎平台上提供了一種完全不同的較無效的編程和運轉環境,你可以將獨立的順序模塊創立為較小的 DLL 文件,並可對它們獨自編譯和測試。在運轉時,只要當 EXE 順序的確要調用這些 DLL 模塊的狀況下,零碎才會將它們裝載到內存空間中。這種方式不只增加了 EXE 文件的大小和對內存空間的需求,而且使這些 DLL 模塊可以同時被多個使用順序運用。Windows 自己就將一些次要的零碎功用以 DLL 模塊的方式完成。

普通來說,DLL 是一種磁盤文件,以.dll、.DRV、.FON、.SYS 和許多以 .EXE 為擴展名的零碎文件都可以是 DLL。它由全局數據、服務函數和資源組成,在運轉時被零碎加載到調用進程的虛擬空間中,成為調用進程的一局部。假如與其它 DLL 之間沒有抵觸,該文件通常映射到進程虛擬空間的同一地址上。DLL 模塊中包括各種導出函數,用於向外界提供服務。DLL 可以有自己的數據段,但沒有自己的堆棧,運用與調用它的使用順序相反的堆棧形式;一個 DLL 在內存中只要一個實例;DLL 完成了代碼封裝性;DLL 的編制與詳細的編程言語及編譯器有關。

在 Win32 環境中,每個進程都復制了自己的讀/寫全局變量。假如想要與其它進程共享內存,必需運用內存映射文件或許聲明一個共享數據段。DLL 模塊需求的堆棧內存都是從運轉進程的堆棧中分配出來的。Windows 在加載 DLL 模塊時將進程函數調用與 DLL 文件的導出函數相婚配。Windows 操作零碎對 DLL 的操作僅僅是把 DLL 映射到需求它的進程的虛擬地址空間裡去。DLL 函數中的代碼所創立的任何對象(包括變量)都歸調用它的線程或進程一切。

調用方式:
1、靜態調用方式:由編譯零碎完成對 DLL 的加載和使用順序完畢時 DLL 卸載的編碼(如還有其它順序運用該 DLL,則 Windows 對 DLL 的使用記載減1,直到一切相關順序都完畢對該 DLL 的運用時才釋放它,復雜適用,但不夠靈敏,只能滿足普通要求。
隱式的調用:需求把發生靜態銜接庫時發生的 .LIB 文件參加到使用順序的工程中,想運用 DLL 中的函數時,只須闡明一下。隱式調用不需求調用 LoadLibrary() 和 FreeLibrary()。順序員在樹立一個 DLL 文件時,鏈接順序會自動生成一個與之對應的 LIB 導入文件。該文件包括了每一個 DLL 導出函數的符號名和可選的標識號,但是並不含有實踐的代碼。LIB 文件作為 DLL 的替代文件被編譯到使用順序項目中。
當順序員經過靜態鏈接方式編譯生成使用順序時,使用順序中的調用函數與 LIB 文件中導出符號相婚配,這些符號或標識號進入到生成的 EXE 文件中。LIB 文件中也包括了對應的 DL L文件名(但不是完全的途徑名),鏈接順序將其存儲在 EXE 文件外部。
當使用順序運轉進程中需求加載 DLL 文件時,Windows 依據這些信息發現並加載 DLL,然後經過符號名或標識號完成對 DLL 函數的靜態鏈接。一切被使用順序調用的 DLL 文件都會在使用順序 EXE 文件加載時被加載在到內存中。可執行順序鏈接到一個包括 DLL 輸入函數信息的輸出庫文件(.LIB文件)。操作零碎在加載運用可執行順序時加載 DLL。可執行順序直接經過函數名調用 DLL 的輸入函數,調用辦法和順序外部其 它的函數是一樣的。

2、靜態調用方式:是由編程者用 API 函數加載和卸載 DLL 來到達調用 DLL 的目的,運用上較復雜,但能愈加無效地運用內存,是編制大型使用順序時的重要方式。

顯式的調用:
是指在使用順序中用 LoadLibrary 或 MFC 提供的 AfxLoadLibrary 顯式的將自己所做的靜態銜接庫調出去,靜態銜接庫的文件名即是下面兩個函數的參數,再用 GetProcAddress() 獲取想要引入的函數。自此,你就可以象運用好像本使用順序自定義的函數一樣來調用此引入函數了。在使用順序加入之前,應該用 FreeLibrary 或 MFC 提供的 AfxFreeLibrary 釋放靜態銜接庫。直接調用 Win32 的 LoadLibary 函數,並指定 DLL 的途徑作為參數。LoadLibary 前往 HINSTANCE 參數,使用順序在調用 GetProcAddress 函數時運用這一參數。GetProcAddress 函數將符號名或標識號轉換為 DLL 外部的地址。順序員可以決議 DLL 文件何時加載或不加載,顯式鏈接在運轉時決議加載哪個 DLL 文件。運用 DLL 的順序在運用之前必需加載(LoadLibrary)加載DLL從而失掉一個DLL模塊的句柄,然後調用 GetProcAddress 函數失掉輸入函數的指針,在加入之前必需卸載DLL(FreeLibrary)。

正由於DLL 有占用內存小,好編輯等的特點有很多電腦病毒都是DLL格式文件。但不能獨自運轉。

靜態鏈接庫通常都不能直接運轉,也不能接納音訊。它們是一些獨立的文件,其中包括能被可執行順序或其它DLL調用來完成某項任務的函數。只要在其它模塊調用靜態鏈接庫中的函數時,它才發揚作用。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved