C++動態連結程式庫

來源:互聯網
上載者:User
  • 動態連結程式庫

動態連結程式庫英文為DLL,是Dynamic Link Library 的縮寫形式,DLL 是一個包含可由多個程式同時使用的代碼和資料的庫,DLL不是可執行檔。動態連結提供了一種方法,使進程可以調用不屬於其可執行代碼的函數。函數的可執行代碼位於一個 DLL 中,該 DLL 包含一個或多個已被編譯、連結並與使用它們的進程分開儲存的函數。DLL 還有助於共用資料和資源。多個應用程式可同時訪問記憶體中單個DLL 副本的內容。DLL 是一個包含可由多個程式同時使用的代碼和資料的庫。

  • 定義

通過使用 DLL,程式可以實現模組化,由相對獨立的組件組成。例如,一個計帳程式可以按模組來銷售。可以在運行時將各個模組載入到主程式中(如果安裝了相應模組)。因為模組是彼此獨立的,所以程式的載入速度更快,而且模組只在相應的功能被請求時才載入。   此外,可以更為容易地將更新應用於各個模組,而不會影響該程式的其他部分。例如,您可能具有一個工資計算程式,而稅率每年都會更改。當這些更改被隔離到 DLL 中以後,您無需重建或安裝整個程式就可以應用程式更新。   下表說明了 Windows 作業系統中的一些作為 DLL 實現的檔案: • ActiveX 控制項 (.ocx) 檔案   ActiveX 控制項的一個樣本是日曆控制項,它使您可以從日曆中選擇日期。   • 控制台 (.cpl) 檔案   .cpl 檔案的一個樣本是位於控制台中的項。每個項都是一個專用 DLL。   • 裝置驅動程式 (.drv) 檔案   裝置驅動程式的一個樣本是控制列印到印表機的印表機驅動程式。

  • DLL 的優點

1、擴充了應用程式的特性;   2、可以用許多種程式設計語言來編寫;   3、簡化了軟體項目的管理;   4、有助於節省記憶體;   5、有助於資源共用;   6、有助於應用程式的本地化;   7、有助於解決平台差異;   8、可以用於一些特殊的目的。windows使得某些特性只能為DLL所用。

  • DLL 依賴項

當某個程式或 DLL 使用其他 DLL 中的 DLL 函數時,就會建立依賴項。因此,該程式就不再是獨立的,並且如果該依賴項被損壞,該程式就可能遇到問題。例如,如果發生下列操作之一,則該程式可能無法運行:   • 依賴 DLL 升級到新版本。   • 修複了依賴 DLL。   • 依賴 DLL 被其早期版本覆蓋。   • 從電腦中刪除了依賴 DLL。   這些操作通常稱為 DLL 衝突。如果沒有強制實現向後相容性,則該程式可能無法成功運行。

  • DLL 進入點

在建立 DLL 時,可以有選擇地指定進入點函數。當進程或線程將它們自身附加到 DLL 或者將它們自身從 DLL 分離時,將調用進入點函數。您可以使用進入點函數根據 DLL 的需要來初始化資料結構或者銷毀資料結構。此外,如果應用程式是多線程的,則可以在進入點函數中使用執行緒區域儲存 (TLS) 來分配各個線程專用的記憶體。下面的代碼是一個 DLL 進入點函數的樣本:   

BOOL APIENTRY DllMain(   HANDLE hModule, // Handle to DLL module   DWORD ul_reason_for_call, // Reason for calling function   LPVOID lpReserved )
 // Reserved   {   switch ( ul_reason_for_call )   {   case DLL_PROCESS_ATTACHED:   
// A process is loading the DLL.   break;   case DLL_THREAD_ATTACHED:   // A process is creating a new thread.   break;   
case DLL_THREAD_DETACH:   // A thread exits normally.   break;   case DLL_PROCESS_DETACH:   // A process unloads the DLL.   break;   }  
 return TRUE;   } 

 

當進入點函數返回 FALSE 值時,如果您使用的是載入時動態連結,則應用程式不啟動。如果您使用的是運行時動態連結,則只有個別 DLL 不會載入。   進入點函數只應執行簡單的初始化任務,不應調用任何其他 DLL 載入函數或終止函數。例如,在進入點函數中,不應直接或間接調用 LoadLibrary 函數或 LoadLibraryEx 函數。此外,不應在進程終止時調用 FreeLibrary 函數。   注意:在多線程應用程式中,請確保將對 DLL 全域資料的訪問進行同步(安全執行緒),以避免可能的資料損毀。為此,請使用 TLS 為各個線程提供唯一的資料。

 

  • 匯出 DLL 函數

要匯出 DLL 函數,您可以嚮導出的 DLL 函數中添加函數關鍵字,也可以建立模組定義檔案 (.def) 以列出匯出的 DLL 函數。

  兩種方法

  方法一、嚮導出的 DLL 函數中添加函數關鍵字

  要使用函數關鍵字,您必須使用以下關鍵字來聲明要匯出的各個函數:

  __declspec(dllexport)

  要在應用程式中使用匯出的 DLL 函數,您必須使用以下關鍵字來聲明要匯入的各個函數:

  __declspec(dllimport)

  通常情況下,您最好使用一個包含 define 語句和 ifdef 語句的標頭檔,以便分隔匯出語句和匯入語句。

  方法二、建立模組定義檔案 (.def) 以列出匯出的 DLL 函數

  使用模組定義檔案來聲明匯出的 DLL 函數。當您使用模組定義檔案時,您不必嚮導出的 DLL 函數中添加函數關鍵字。在模組定義檔案中,您可以聲明 DLL 的 LIBRARY 語句和 EXPORTS 語句。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.