Windows動態鏈結庫DLL

2021-09-05 01:35:29 字數 1735 閱讀 8491

1.什麼是dll

dll,即動態鏈結庫,是包含若干個函式的庫檔案,可供其他程式執行時呼叫。

2.dll的優缺點

優點:**重用,可供多個程式同時呼叫

缺點:易發生版本衝突

當新版本的動態鏈結庫不相容舊版本時,其他使用該dll的程式可能無法正常工作。

針對這一問題,我們需要在程式中加上乙個manifest檔案,指明該程式所使用的dll版本號。

此時,程式將根據manifest載入指定版本的dll,否則按預設版本載入。

3.關於lib和dll

lib,是靜態鏈結庫,分為靜態lib和動態lib。

靜態lib:包含函式**宣告和實現,編譯後所有**都嵌入到宿主程式中。不需要再另行呼叫dll。

動態lib:相當於乙個.h標頭檔案,它是對實現部分(.dll)的匯出部分的宣告。編譯後宿主程式也只包括宣告部分。執行時需呼叫相應的dll檔案。

4.dll編寫

1)在vs中,選擇「檔案」-》「新建」-》「專案」,選擇「visual c++」-》「win32專案」,來建立dll類庫。

如下圖所示:

2)新增標頭檔案(.h)和原始檔(.cpp)

mydll.h 

extern "c" _declspec(dllexport) int add(int a, int b);
extern關鍵字:函式可以在本模組或其他模組中使用;

"c":表明函式必須按c語言方式進行編譯,因為c++支援函式的過載,編譯時會對函式名進行更改(按照函式名+引數型別),

所以需要宣告"c",以便鏈結時能正確找到相應的函式。

_declspec(dllexport)關鍵字:該函式可以從dll中匯出,程式引入dll時,只有宣告了該關鍵字的函式,才能匯入使用

mydll.cpp 

#include "mydll.h" 

int add(int a, int b) //該dll需要匯出的函式功能:加法

編譯後,我們可以在生成目錄中找到相應的dll檔案和lib檔案。

mydll.dll,mydll.lib

5.dll呼叫

呼叫dll有兩種方式。

1)顯式鏈結(只使用dll)

特點:不需要使用相應的lib檔案,可隨時載入和解除安裝dll,方便靈活。

void main(void)

上例通過loadlibray()將dll載入到當前的應用程式,並返回當前dll檔案的控制代碼。

然後通過getprocaddress()函式獲取匯入到應用程式中的函式指標,

函式呼叫完畢後,使用freelibrary()解除安裝dll檔案。

2)隱式鏈結(使用lib,dll)

特點:程式開始執行時將dll檔案載入到應用程式中,程式結束後,釋放dll。

#pragma comment(lib,"mydll.lib")

extern "c"_declspec(dllimport) int add(int a,int b);

void main()

#pragma comment是預處理指令,使得鏈結器在鏈結庫的時候去找"mydll.lib"這個庫。

引用:

動態鏈結庫DLL

函式和資料被編譯進乙個二進位制檔案 通常擴充套件名為.lib 靜態庫 在使用靜態庫的情況下,在編譯鏈結可執行檔案時,鏈結器從庫中複製這些函式和資料並把它們和應用程式的其它模組組合起來建立最終的可執行檔案 exe檔案 在多個同樣的程式執行時,系統保留了許多重複的 副本,造成記憶體資源浪費。動態庫 使用...

Windows核心程式設計 動態鏈結庫 DLL基礎

為了全面地了解dll如何執行,以及開發者和系統如何正確地使用dll,我們首先來研究一下dll的基本執行機理。下圖概括了dll的各構件是如何鏈結在一起的。現在,我們關注的焦點是可執行模組和dll模組之間是如何進行隱式鏈結的。隱式鏈結是目前最為常用的鏈結型別。windows同時支援顯示鏈結 顯示鏈結將在...

DLL(動態鏈結庫)程式設計

dll是現在常見的檔案,它整合了程式的很多功能在裡面。一般情況下,它不能直接被執行,常見的使用方法是用其他的 exe呼叫其執行,以使其內部功能表現出來。還有 ocx檔案也與之類似,也就是人們常說的com 1.簡要 windows api中所有的函式都包含在dll中,其中有3個最重要的dll。1 ke...