天天看點

動态連結庫基本概念

在 Windows中存在一種叫做DLL(Dynamic Linkable Library動态連結庫)的檔案。它可以提供一些應用程式可以導入的資料、函數和類。DLL檔案平時駐留在磁盤中,隻有當運作的應用程式确實要調用這些DLL子產品的情況下,系統才會将它們裝載到記憶體空間中。這種方式不僅可以減少了應用程式EXE檔案的大小和對記憶體空間的需求,耐而且這些DLL子產品可以同時被多個應用程式所共享,進而極大友善了應用程式的設計。

以前曾經用庫函數實作了代碼共享。這樣存在一些缺點:一個缺點是增加了應用程式的代碼量,它會占用更多的磁盤空間,同時在程式運作時也會占用較大的記憶體空間,進而造成了系統資源的浪費;另一個缺點是,在編寫大的EXE程式時,每次重建時都必須高速編譯所有源代碼。

而DLL檔案有以下為衆所歡迎的特點:

• 它是動态連結的,即平時它駐留在本地在計算機的硬碟中,隻有當某應用程式确實要調用 這些DLL子產品的情況下,系統才會将它們從磁盤上裝載到記憶體空間中,是以它不會使應用程式的代碼量加大。

• 它是公用的, 即當它一旦被調入記憶體則在記憶體中它隻有一份檔案,而該檔案可以被Windows應用程式所調用。

• 當已經沒有應用程式再需要調用它時,它會自動解除安裝以釋放所占用的記憶體。

• 它們擴充了應用程式的特性。

• 它們可以用許多種程式設計語言來編寫。

• 它們簡化了軟體項目的管理。

• 它們有助于資源的共享。

• 它們有助于應用程式的本地化

• 它們有助于解決平台差異。

• 它們可以用于一些特殊的目的。

動态連結庫的組成

DLL必須有一個類似main函數的入口函數。還應該包含外部應用程式可以調用的函數對象和資源等。

1動态連結庫的入口函數。

MFC AppWizard編寫DLL時,在一般的情況下它都會給程式員提供一個預設的DLL入口函數。

BOOL WINAPI DllMain(

  HINSTANCE hinstDLL,  // handle to DLL module

  DWORD fdwReason,     // reason for calling function

  LPVOID lpvReserved   // reserved

);

第一個參數:是指向DLL本身的句柄;

第二個參數:常被用來指明DLL被調用的原因;

第三個參數:是系統所保留的參數;

入口函數的主要作用就是在系統調用該DLL時,進行一些初始化工作。由于DLL的初始化工作常常出現如下四種情況。Windows定定義了與這4種相對應的常數。

ul_reason_for_call參數的常數
常數 說明
DLL_PROCESS_ATTACH 程序被調用
DLL_THREAD_ATTACH 線程被調用
DLL_PROCESS_DETACH 程序被停止
DLL_THREAD_DETACH 線程被停止

2導出函數和内部函數

繼續閱讀