您好,登錄后才能下訂單哦!
http://c.biancheng.net/cpp/html/2750.html
DLL 是 Dynamic Link Library 的縮寫,譯為“動態鏈接庫”。DLL也是一個被編譯過的二進制程序,可以被其他程序調用,但與 exe 不同,DLL不能獨立運行,必須由其他程序調用載入內存。
DLL 中封裝了很多函數,只要知道函數的入口地址,就可以被其他程序調用。
Windows API中所有的函數都包含在DLL中,其中有3個最重要的DLL:
Kemel32.dll:它包含那些用于管理內存、進程和線程的函數,例如CreateThread函數;
User32.dll:它包含那些用于執行用戶界面任務(如窗口的創建和消息的傳送)的函數,例如 CreateWindow 函數;
GDI32.dll:它包含那些用于畫圖和顯示文本的函數。
函數和數據被編譯進一個二進制文件(通常擴展名為.LIB)。在使用靜態庫的情況下, 在編譯鏈接可執行文件時,鏈接器從庫中復制這些函數和數據并把它們和應用程序的其他模塊組合起來創建最終的可執行文件(.EXE文件)。當發布產品時,只需要發布這個可執行文件,并不需要發布被使用的靜態庫。
在使用動態庫的時候,往往提供兩個文件:一個引入庫(.lib)文件和一個DLL (.dll) 文件。雖然引入庫的后綴名也是“lib”,但是,動態庫的引入庫文件和靜態庫文件有著本質上的區別,對一個DLL來說,其引入庫文件(.lib)包含該DLL導出的函數和變量的符號名,而.dll文件包含該DLL實際的函數和數據。在使用動態庫的情況下,在編譯鏈接可執行文件時,只需要鏈接該DLL的引入庫文件,該DLL中的函數代碼和數據并不復制到可執行文件中,直到可執行程序運行時,才去加載所需的DLL,將該DLL映射到進程的地址空間中,然后訪問DLL中導出的函數。這時,在發布產品時,除了發布可執行文件以外,同時還要發布該程序將要調用的動態鏈接庫。
我們可以采用自己熟悉的開發語言編寫DLL,然后由其他語言編寫的可執行程序來調用這些DLL。例如,可以利用VB來編寫程序的界面,然后調用利用VC++或Delphi編寫的完成程序業務邏輯的DLL。
在發布產品時,可以發布產品功能實現的動態鏈接庫規范,讓其他公司或個人遵照這個規范開發自己的DLL,以取代產品原有的DLL,讓產品調用新的DLL,從而實現功能 的增強。在實際工作中,我們看到許多產品都提供了界面插件功能,允許用戶動態地更換程序的界面,這就可以通過更換界面DLL來實現。
在銷售產品的同時,可以采用DLL的形式提供一個二次開發的平臺,讓用戶可以利用該DLL調用其中實現的功能,編寫符合自己業務需要的產品,從而實現二次開發。
在一個大型項目開發中,通常都是由多個項目小組同時開發,如果采用串行開發,則效率是非常低的。我們可以將項目細分,將不同功能交由各項目小組以多個DLL的方式實現,這樣,各個項目小組就可以同時進行開發了。
如果多個應用程序需要訪問同樣的功能,那么可以將該功能以DLL的形式提供,這樣在機器上只需要存在一份該DLL文件就可以了,從而節省了磁盤空間。另外,如果多個應用程序使用同一個DLL,該DLL只需要放入內存一次,所有的應用程序就都可以共亨它了。這樣,內存的使用將更加有效。
我們知道,當進程被加載時,系統會為它分配內存,接著分析該可執行模塊,找到該程序將要調用哪些DLL,然后系統搜索這些DLL,找到后就加載它們,并為它們分配內存空間。DLL的內存空間只有一份,如果有第二個程序也需要加載該DLL,那么它們共享內存空間,相同的DLL不會再次加載。
DLL可以包含對話框模板、字符串、圖標和位圖等多種資源,多個應用程序可以使用DLL來共享這些資源。在實際工作中,可以編寫一個純資源的動態鏈接庫,供其他應用程序訪問。
如果產品需要提供多語言版本,那么就可以使用DLL來支持多語言。可以為每種語言創建一個只支持這種語言的動態鏈接庫。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。