DLL動態呼叫

2021-04-17 23:37:52 字數 2455 閱讀 2094

動態鏈結庫,靜態鏈結庫,動態呼叫,靜態呼叫,前面老是搞混,現在總算差不多明白了,再多用用幾次就好了. 靜態呼叫可以當作普通的靜態庫那樣用,動態呼叫就得用loadlibraly來呼叫.同時生成的lib檔案,動態鏈結庫中的lib與靜態鏈結的lib檔案是不一樣的,乙個是只含有入口位址,沒有函式內容,而另乙個(靜態)的是都有.

1、引言

動態庫(dynamic link library abbr,dll)技術是程式設計中經常採用的技術。其目的減少程式的大小,節省空間,提高效率,具有很高的靈活性。

採用動態庫技術對於公升級軟體版本更加容易。與靜態庫(static link library)不同,動態庫裡面的函式不是執行程式本身的一部分,而是根據執行需要按需載入,其執行**可以同時在多個程式中共享。

在windows和linux作業系統中,都可採用這種方式進行軟體設計,但他們的呼叫方式以及程式編制方式不盡相同。本文首先分析了在這兩種作業系統中通常採用的動態庫呼叫方法以及程式編制方式,然後分析比較了這兩種方式的不同之處,最後根據實際移植程式經驗,介紹了將vc++編制的windows動態庫移植到linux下的方法。

2、動態庫技術

2.1 windows動態庫技術

動態鏈結庫是實現windows應用程式共享資源、節省記憶體空間、提高使用效率的乙個重要技術手段。常見的動態庫包含外部函式和資源,也有一些動態庫只包含資源,如windows字型資源檔案,稱之為資源動態鏈結庫。通常動態庫以.dll,.drv、.fon等作為字尾。

相應的windows靜態庫通常以.lib結尾,windows自己就將一些主要的系統功能以動態庫模組的形式實現。

windows動態庫在執行時被系統載入到程序的虛擬空間中,使用從呼叫程序的虛擬位址空間分配的記憶體,成為呼叫程序的一部分。dll也只能被該程序的執行緒所訪問。dll的控制代碼可以被呼叫程序使用;呼叫程序的控制代碼可以被dll使用。

dll模組中包含各種匯出函式,用於向外界提供服務。dll可以有自己的資料段,但沒有自己的堆疊,使用與呼叫它的應用程式相同的堆疊模式;乙個dll在記憶體中只有乙個例項;dll實現了**封裝性;dll的編制與具體的程式語言及編譯器無關,可以通過dll來實現混合語言程式設計。dll函式中的**所建立的任何物件(包括變數)都歸呼叫它的執行緒或程序所有。

根據呼叫方式的不同,對動態庫的呼叫可分為靜態呼叫方式和動態呼叫方式。

(1)靜態呼叫,也稱為隱式呼叫,由編譯系統完成對dll的載入和應用程式結束時dll解除安裝的編碼(windows系統負責對dll呼叫次數的計數),呼叫方式簡單,能夠滿足通常的要求。通常採用的呼叫方式是把產生動態連線庫時產生的.lib檔案加入到應用程式的工程中,想使用dll中的函式時,只須在原始檔中宣告一下。

lib檔案包含了每乙個dll匯出函式的符號名和可選擇的標識號以及dll檔名,不含有實際的**。lib檔案包含的資訊進入到生成的應用程式中,被呼叫的dll檔案會在應用程式載入時同時載入在到記憶體中。

(2)動態呼叫,即顯式呼叫方式,是由程式設計者用api函式載入和解除安裝dll來達到呼叫dll的目的,比較複雜,但能更加有效地使用記憶體,是編制大型應用程式時的重要方式。在windows系統中,與動態庫呼叫有關的函式包括:

①loadlibrary(或mfc 的afxloadlibrary),裝載動態庫。

②getprocaddress,獲取要引入的函式,將符號名或標識號轉換為dll內部位址。

③freelibrary(或mfc的afxfreelibrary),釋放動態鏈結庫。

在windows中建立動態庫也非常方便和簡單。在visual c++中,可以建立不用mfc而直接用c語言寫的dll程式,也可以建立基於mfc類庫的dll程式。每乙個dll必須有乙個入口點,在vc++中,dllmain是乙個預設的入口函式。dllmain負責初始化(initialization)和結束(termination)工作。

動態庫輸出函式也有兩種約定,分別是基於呼叫約定和名字修飾約定。dll程式定義的函式分為內部函式和匯出函式,動態庫匯出的函式供其它程式模組呼叫。通常可以有下面幾種方法匯出函式:

①採用模組定義檔案的export部分指定要輸入的函式或者變數。

②使用mfc提供的修飾符號_declspec(dllexport)。

③以命令列方式,採用/export命令列輸出有關函式。

在windows動態庫中,有時需要編寫模組定義檔案(.def),它是用於描述dll屬性的模組語句組成的文字檔案。

2.2 linux共享物件技術

在linux作業系統中,採用了很多共享物件技術(shared object),雖然它和windows裡的動態庫相對應,但它並不稱為動態庫。相應的共享物件檔案以.so作為字尾,為了方便,在本文中,對該概念不進行專門區分。linux系統的/lib以及標準圖形介面的/usr/x11r6/lib等目錄裡面,就有許多以so結尾的共享物件。

同樣,在linux下,也有靜態函式庫這種呼叫方式,相應的字尾以.a結束。linux採用該共享物件技術以方便程式間共享,節省程式占有空間,增加程式的可擴充套件性和靈活性。linux還可以通過ld-preload變數讓開發人員可以使用自己的程式庫中的模組來替換系統模組。

動態呼叫DLL

有靜態和動態兩種,靜態的需要lib而動態的只需要乙個dll就可以了 但是要知道函式的定義一般是標頭檔案 動態相對複雜一點!但是掌握了也不是很難 第一步 定義函式指標就是你要呼叫的函式,引數必須一致,不然就記憶體洩露 typedef handle pascal open char int 第二步 定義...

VC動態呼叫DLL

1.生成dll extern c declspec dllexport char sendmess char buffer,int length 呼叫的時候要先給buffer分配記憶體 new 不然會出10014的錯誤.10014 系統檢測到在乙個呼叫中嘗試使用指標引數時的無效指標位址。2.動態呼叫...

C 動態呼叫DLL

在工作中經常需要寫dll並呼叫。本文寫出一種最簡單實用的dll動態呼叫的demo。口訣 1個檔案2行單詞3步走 dll1個檔案2個單詞 1個檔案.def,2個單詞 export test函式名 exe3步走。申明函式,載入庫,指向函式 1 新建乙個空的exe專案 2 新建乙個空的dll專案,並新增同...