用戶模塊
用戶模塊
定義 用戶模塊是由用戶自己開發的、可以加入到最終用戶(包括用戶本人和其他使用該模塊的人)應用程序中提供某一特定功能的函數和類的集合。為了完成同樣的工作,也可以向最終用戶提供源程序。但是,使用用戶模塊有許多好處:首先是省去用戶管理源代碼的煩惱,用戶許多情況下往往並不關心模塊的內部實現,他只是想把它作為一個黑匣子使用。另外,模塊的開發者有時候並不希望模塊使用者看到源代碼。還有,使用模塊而不使用源代碼還可以避免模塊的函數名、變數名與最終用戶的程序上的衝突。
用戶模塊可分為兩大類:靜態連接庫和動態連接庫。
靜態連接庫提供了函數的完整的目標代碼,如果程序調用靜態連接庫中的函數,則在進行連接時連接程序將靜態連接庫中所包含的該函數的代碼拷貝至運行文件中。
動態連接庫是一個可執行模塊,其包含的函數可以由Windows應用程序調用以執行一些功能。動態連接庫主要為應用程序模塊提供服務。Windows內核的三個模塊USER.EXE、KENERL.EXE和GDI.EXE實際上都是動態連接庫,分別提供用戶消息服務、進程管理、圖形輸出等服務。
動態連接庫也包含了其所提供的函數的目標代碼,但是在程序連接動態連接庫中的函數時,連接程序並不將包含在動態連接庫中的函數的目標代碼拷貝至運行文件,而只是簡單地記錄了函數的位置信息(即包含於哪個動態連接庫中以及在動態連接庫中的位置)。有了這些信息后,程序在執行時,即可找到該函數的目標代碼。因為只是在執行時才得到真正的連接,因此稱為動態連接。提供函數在動態連接庫中位置的信息存放在一個獨立的文件中,這個文件就是引入庫(IMPORT LIB)。
由於靜態連接庫將目標代碼連接到應用程序中,當程序運行時,如果兩個程序調用了同一靜態庫中的函數,內存中將出現該函數的多份拷貝。而動態連接庫則更適合於多任務環境:當兩個應用程序調用了同一動態連接庫中的同一個函數時,內存中只保留該函數的一份拷貝,這樣內存利用率更高。
利用動態連接庫還可以實現資源共享:像Windows下的串列口、并行口驅動程序都是動態連接庫;另外,Windows下的字體也是動態連接庫。
但是,靜態庫由於將目標代碼連入應用程序中,應用程序可獨立運行。而使用動態連接庫時,隨同應用程序還要提供動態連接庫文件(DLL文件)。比如,發布Visual C++編寫的程序時,如果使用了動態連接,則在提供可執行文件同時還需要提供Visual C++的動態連接庫。
應用程序和動態連接庫都是完成一定功能的可執行模塊。它們的區別是:應用程序有自己的消息循環,而動態連接庫沒有自己的消息循環(但是它可以發送消息);應用程序一般是主動完成某一功能的,而動態連接庫主要是被動(在中斷驅動程序中也主動完成一些功能)的提供服務。