你是否有過這樣的經歷?在配置不是很好的機器上運行一些不是很完善的Windows應用程序,系統速度越來越慢,直至彈出一個警告對話框:“系統資源嚴重不足!請關閉部分Windows應用程序......”。這往往是靜態鏈接的緣故。使用普通的函數庫,在程序鏈接時將庫中的代碼拷貝到可執行文件中,這叫作靜態鏈接。假設有多個程序同時執行,這時內存中就會保留許多重復的代碼副本。
使用動態鏈接庫則不一樣。只有程序在執行時才將庫代碼裝入內存。對於同一個動態鏈接庫,無論有多少個應用程序同時在使用它,內存中都只有一個動態鏈接庫的副本。如果動態鏈接庫不再被任何程序使用,系統就將它調出內存,這就減少了應用程序對內存的要求。
動態鏈接庫是一種程序模塊,它不僅可以包含可執行代碼,而且通常還包含了各種類型的預定義的數據和資源,擴大了庫文件的使用范圍。Windows操作系統使用了許多動態鏈接庫。比如我們使用Visual C++建立MFC應用程序時,如果在AppWizard向導中選擇了使用MFC作為動態鏈接庫,那麼所有這種類型的程序至少都共用了“C:\Windows\System”目錄下的MFC動態鏈接庫文件Msvcrt.dll和Mfc42.dll。許多設備的驅動程序也是用動態鏈接庫實現的,擴展名一般為.drv。
動態鏈接庫技術常常用於開發大型軟件系統。一個大型軟件系統如果只通過一個可執行文件來完成,那程序就太龐大了,而且可能有許多重復的功能。這時如果將程序分解,由一系列主程序和動態鏈接庫組成,這就減少了開發難度和工作量,提高了訪問的速度,更有利於對整個系統的管理。
動態鏈接庫的另一個用途是軟件產品國際化。開發人員可以將依賴於各國語言的資源分離開來,各自放進專門的動態鏈接庫中。各國不同的用戶可以在安裝和運行時,選擇適當語言版本的動態鏈接庫,這樣主程序不用改變就可以用於全球范圍。這是實現軟件國際化的一項技術。
知道了動態鏈接庫的這些特點,相信讀者不難明白為什麼動態鏈接庫的應用那麼廣泛了。