首先介紹一些概念,然後介紹如何的建立靜態連結庫和動態連結程式庫。
(一)動態連結程式庫和靜態連結庫
1. 靜態庫
函數和資料被編譯進一個二進位檔案(通常副檔名為.lib)。在使用靜態庫的情況下,在編譯串連可執行檔時,連結器從庫中複製這些函數和資料並把它們和應用程式的其他模組組合起來建立最終的可執行檔(.exe檔案);當發布產品的時候,只需要發布這個可執行檔,並不需要發布被使用的靜態庫。 2. 動態庫 在使用動態庫的時候,往往提供兩個檔案:一個引入庫(.lib)檔案和一個DLL(.dll)檔案。雖然引入庫的尾碼也是lib,但是動態庫的引入庫和靜態庫檔案有著本質的不同。在使用動態庫的情況下,在編譯連結可執行檔時,只需要連結該DLL的引入庫檔案,該DLL中的函數代碼和資料並不複製到可執行檔中,直到可執行程式運行時,才去載入所需要的DLL,將該DLL映射到進程的地址空間中,然後訪問DLL中的匯出的函數;在發布產品時,除了發布可執行檔以外,還有同時發布該程式將要調用的動態連結程式庫。 動態連結程式庫通常不能直接運行,也不能接收訊息。只有在其他模組調用動態連結程式庫中的函數時,它才發揮作用。實際編程時,我們可以把完成某種功能的函數放在一個動態連結程式庫中,然後提供給其他程式調用。
註:上面說的可能有點繞,簡單概括:靜態連結庫與動態連結程式庫都是共用代碼的方式,如果採用靜態連結庫,則無論你願不願意,lib 中的指令都全部被直接包含在最終產生的 EXE 檔案中了。但是若使用 DLL,該 DLL 不必被包含在最終 EXE 檔案中,EXE 檔案執行時可以“動態”地引用和卸載這個與 EXE 獨立的 DLL 檔案。靜態連結庫和動態連結程式庫的另外一個區別在於靜態連結庫中不能再包含其他的動態連結程式庫或者靜態庫,而在動態連結程式庫中還可以再包含其他的動態或靜態連結庫。
(二)三種不同的DLL
Visual C++支援三種DLL,它們分別是非MFC動態庫(Non-MFC
DLL)、MFC規則DLL(MFC
Regular DLL)、MFC擴充DLL(MFC
Extension DLL)。
1.
非MFC動態庫指的是不用MFC的類庫結構,直接用C語言寫的DLL,其匯出的函數是標準的C介面,能被非MFC或MFC編寫的應用程式所調用。 在VC++6.0中,File-->New-->Win32 Dynamic-Link Library建立非MFC動態庫。
2.
常規DLL:和下述的擴充DLL一樣,是用MFC類庫編寫的,它的一個明顯的特點是在源檔案裡有一個繼承CWinApp的類(注意:此類DLL雖然從CWinApp派生,但沒有訊息迴圈),被匯出的函數是C函數、C++類或者C++成員函數(注意不要把術語C++類與MFC的微軟基礎C++類相混淆),調用常規DLL的應用程式不必是MFC應用程式,只要是能調用類C函數的應用程式就可以,它們可以是在Visual
C++、Dephi、Visual Basic、Borland C等編譯環境下利用DLL開發應用程式。 常規DLL又可細分成靜態連結到MFC和動態連結到MFC上的,這兩種常規DLL的區別將在下面介紹。 在VC++6.0中,File-->New-->MFC
AppWizard[dll],接著有三個選項:Regular DLL with MFC statically linked是建立一個常規的動態連結程式庫,該DLL使用MFC的靜態連結;Regular
DLL using shared MFC DLL是建立一個常規的動態連結程式庫,該DLL使用共用的MFC DLL;MFC Extension DLL是建立一個擴充的MFC DLL。 3. 與常規DLL相比,使用
擴充DLL用於匯出增強
MFC基礎類的函數或子類,用這種類型的動態連結程式庫,可以用來輸出一個從MFC所繼承下來的類。
擴充DLL是使用MFC的動態連結版本所建立的,並且它只被用MFC類庫所編寫的應用程式所調用。例如你已經建立了一個從MFC的CtoolBar類的衍生類別用於建立一個新的工具列,為了匯出這個類,你必須把它放到一個MFC擴充的DLL中。擴充DLL
和常規DLL不一樣,它沒有一個從CWinApp繼承而來的類的對象,所以,開發人員必須在DLL中的DllMain函數添加初始化代碼和結束代碼。