動態連線庫 DLL 的基礎知識

2021-06-23 04:24:37 字數 2231 閱讀 4515

所謂的庫,就是程式設計師把一些常用的函式寫在乙個檔案內,以方便其它程式呼叫。庫分為兩種,靜態鏈結庫和動態鏈結庫。

靜態鏈結庫,就是在鏈結時把庫檔案鏈到自己的程式內,也就是整合成乙個exe檔案。但是這樣有乙個缺點,就是我們把所有內容都加在這個程式中,使得程式體積增大。如果每個應用程式都用靜態鏈結庫的話,那麼每個程式的體積都將很大。這是非常浪費硬碟空間的。

動態鏈結庫就可以解決這樣的問題。他是在程式執行的時候動態地把這個庫載入到應用程式的位址空間中,而無需在程式鏈結時加入程式中,這樣程式和dll檔案實際上是分離的,程式的體積不會增大,同時又可以使用dll中的函式。

一、編寫乙個簡單的dll。

我們用vc新建乙個dll專案,名字就叫dll吧。我們只打算在其中寫乙個簡單的函式,如下

#include "dll.h"

int add(int a,int b)

這是乙個簡單的求和函式。我們想要在應用程式中使用這個函式,必須在dll中將它宣告為匯出函式。

extern "c" __declspec(dllexport) int add(int,int);

__declspec(dllexport)表示了後面的函式是要匯出的。

如果dll程式是用c++寫的,c++編譯器會對函式名和變數名進行改編。而如果乙個exe檔案是用c寫的,編譯器不會對函式名改編(事實上也會也一些改變,但是和c++的改變方式不同)。這樣,在鏈結時,聯結器會發現exe檔案引用了乙個不存在的符號。由此出錯。加上extern "c",則告訴編譯器按照c的方式編譯函式名。

我們還可以用另一中方式來匯出函式,就是使用def檔案。

當用def檔案匯出函式時,函式的名字就不會發生任何改變。def檔案的使用非常簡單,只要在def檔案的匯出段中寫上函式名就可以了。就像這樣:

; dll.def  在def檔案中,注釋用分號「;」標誌

exports

; 此處可以是顯式匯出

add

就是這麼簡單!

現在我們的dll檔案已經寫好了,我們可以直接生成這個dll了。

我們發現在生成的檔案中,除了乙個dll.dll之外,還有乙個dll.lib檔案。

只要我們在dll中匯出了乙個函式、變數或者類,生成dll的同時會自動生成乙個lib檔案。lib檔案裡面就包含了匯出的符號。

二、在應用程式中使用dll。

應用程式中使用dll有兩種方法,隱式鏈結和顯示鏈結。我這裡只講一下隱式鏈結。

我們新建乙個exe的專案,首先我們需要把上面生成的dll.dll和dll.lib兩個檔案複製到應用程式的工程目錄內。

或者 我們可以用一行**來完成上述動作:

#pragma comment(lib,"dll.lib")
第二步我們必須宣告這個函式是從外部檔案匯入的,有兩種方式可以宣告,第一種比較簡單,直接用extern關鍵字:

extern int add(int,int);

__declspec(dllimport) int add(int,int);
__declspec(dllimport)直接告訴編譯器,add函式是從乙個dll檔案中匯入的。

好了,以上工作都做完了,我們就可以在程式中正常使用add函式了。

三、dllmain函式

dll中也可以有乙個入口點函式,為dllmain函式。注意這個函式的大小寫,不能隨意改動。在dllmain函式中,我們可以做一些初始化工作。

該函式原型如下:

bool winapi dllmain(

hinstance hinstdll,//該dll的例項控制代碼

dword fdwreason,//dllmain被呼叫的原因

pvoid fimpload)//如果dll是顯示載入的,該值為0;否則,該值不為0

那麼這個dllmain函式在什麼時候被呼叫呢,我們來看乙個例子:

bool winapi dllmain(hinstance hinstdll,dword fdwreason,pvoid fimpload)

return true;//該返回值僅供第乙個case使用。比如初始化成功,返回true,失敗返回false。如果返回失敗,在隱式鏈結dll的情況下,應用程式會啟動失敗。其它case下忽略返回值。

}

動態連線庫(DLL)

把c 的類寫進dll裡,單獨的編譯。程式執行時可以快速裝載並連線到dll上,這樣叫做標準的模組軟體。大大提高 的重用型。dll是執行時的模組。win32 dll允許匯出全域性變數,就象匯出函式一樣。只要dll申請記憶體,就從客戶程式的程序的記憶體堆中進行記憶體分配。dll包含乙個匯出函式表,它包含了...

建立DLL動態連線庫

建立dll動態連線庫 3 製作dll 動態連線庫,但要宣告 uses unit1 in unit1.pas exports createform name myform 4 呼叫窗體的程式按普通方法製作,但是 在implementation下首先宣告要呼叫的dll函式 const gdi32 myf...

資料庫的基礎知識

1.通過集合的方式進行理解 以集合的方式來理解的話,乙個表就是乙個多個域隨意組合的結果的乙個子集,通過選擇 投影 並 差 笛卡爾積的方式將想要的結果展示出來。2.通過迴圈的方式進行理解 迴圈的話以exists為例 學生是否選擇了一號課為例 select sno from student s wher...