windows 動態鏈結庫程式設計
>
1、介紹
windows作業系統是應用最關的作業系統,因此動態鏈結庫也為程式設計師所熟悉,即使對於普通的使用者來說,很多時候也會碰到.dll結尾的檔案,這就是動態鏈結庫檔案。windows下的動態鏈結庫可以通過參考標頭檔案和.lib庫檔案進行編譯,從而使得動態鏈結庫隱式地被使用;也可以使用loadlibrary、getprocaddress等函式來顯式呼叫動態鏈結庫。
2、語法、匯入匯出
在windows程式設計中,對於要使用或被使用的函式或者變數,需要使用 __declspec 關鍵字來宣告,以告訴編譯器該變數或函式不是普通的變數或函式,而是乙個動態鏈結庫的介面屬性。
如果定義乙個要被其他**使用的函式,可以寫成:
__declspec( dllexport ) int add(int a, int b);
如果在該**中,打算使用另外乙個程式中的變數,則可以寫成:
__declspec( dllimport ) char *name;
動態鏈結庫通常包含一系列供其他程式使用函式,因此 declspec( dllexport ) 語法形式最為常用。如果動態庫需要其他程式中的定義的全域性變數,則需要在其他程式中使用匯出該變數,在動態鏈結庫中則需要使用 extern declspec( dllexport ) 將該變數宣告為外部變數以便使用。
3、鏈結方式
隱式鏈結
顯式鏈結
隱式鏈結有時稱為靜態載入或載入時動態鏈結。顯式鏈結有時稱為動態載入或執行時動態鏈結。在隱式鏈結下,使用 dll 的可執行檔案鏈結到該 dll 的建立者所提供的導入庫(.lib 檔案)。使用 dll 的可執行檔案載入時,作業系統載入此 dll。客戶端可執行檔案呼叫 dll 的匯出函式,就好像這些函式包含在可執行檔案內一樣。
在顯式鏈結下,使用 dll 的可執行檔案必須進行函式呼叫以顯式載入和解除安裝該 dll,並訪問該 dll 的匯出函式。客戶端可執行檔案必須通過函式指標呼叫匯出函式。可執行檔案對兩種鏈結方法可以使用同乙個 dll。另外,由於乙個可執行檔案可隱式鏈結到某個 dll,而另乙個可顯式附加到此 dll,故這些機制不是互斥的。
4、隱式鏈結
隱式鏈結動態鏈結庫比較簡單,不予詳述。
5、顯式鏈結api函式
顯式鏈結主要涉及到3個api函式( loadlibrary , getprocaddress 和 freelibrary ),要使用這些函式包含windows.h標頭檔案即可。
(1)hinstance loadlibrary(lpcstr lplibfilename);
該函式用來載入指定動態庫檔案,並且返回控制代碼。
1、當前程序的可執行模組所在的目錄。
2、當前目錄。
3、windows 系統目錄。getsystemdirectory 函式檢索此目錄的路徑。
4、windows 目錄。getwindowsdirectory 函式檢索此目錄的路徑。
5、path 環境變數中列出的目錄。
(2)farproc getprocaddress (hmodule hmodule, lpcstr lpprocname);
函式getprocaddress 用來獲取 dll 匯出函式的位址。返回由lpprocname指定的變數或函式指標。
引數hmodule為已經載入的動態庫檔案的控制代碼。
引數lpprocname為要呼叫的變數或函式名稱。
(3)bool freelibrary(hmodule hmodule);
從記憶體中釋放hmodule所代表的動態鏈結庫。
(4)如果發生錯誤,可以呼叫getlasterror()函式或去錯誤**。
6、顯示鏈結舉例
(1)動態庫檔案**:dll_demo.c
#include
__declspec( dllexport ) int add(int a, int b)
該檔案中的add()函式計算兩個整數之和,並且返回之前列印提示字串。函式使用 __declspec( dllexport ) 語法來說明函式add(int a, int b)要被匯出。
(2)客戶端事例**:main.c
#include
#include
int main (int argc, char *argv)
if((add = (int (*)())getprocaddress(hinstlibrary, "add")) == null)
c = add(a, b);
printf("%d + %d = %d/n", a, b, c);
freelibrary(hinstlibrary);
return 0;
}程式利用loadlibrary函式載入動態鏈結dll_demo.dll,利用freelibrary關閉控制代碼,利用getlasterror()獲取錯誤**,利用getprocaddress定位共享庫中的add函式,然後呼叫該函式執行加法計算,並列印結果。
(3)編譯與執行
編譯共享庫:
在vs.net中建立乙個動態鏈結庫專案,名稱為dll_demo,加入檔案dll_demo.c,編譯後生成dll_demo.dll檔案。
編譯事例程式:
在vs.net中建立乙個動態鏈結庫專案,名稱為dll_main,加入檔案main.c,編譯後生成dll_main.exe可以執行檔案。
執行:將 dll_demo.dll 和 dll_main.exe 放在同乙個目錄下,然後雙擊執行 dll_main.exe。
輸出:load dll file
calling add
10 + 20 = 30
7、呼叫動態鏈結庫中的變數
__declspec( dllexport ) int num = 100;
那麼可以在事例程式中這樣呼叫:
int *d;
d = (int *)getprocaddress(hinstlibrary, "num");
printf("num = %d/n", *d);
Windows動態鏈結庫DLL
1.什麼是dll dll,即動態鏈結庫,是包含若干個函式的庫檔案,可供其他程式執行時呼叫。2.dll的優缺點 優點 重用,可供多個程式同時呼叫 缺點 易發生版本衝突 當新版本的動態鏈結庫不相容舊版本時,其他使用該dll的程式可能無法正常工作。針對這一問題,我們需要在程式中加上乙個manifest檔案...
Windows核心程式設計 動態鏈結庫 DLL基礎
為了全面地了解dll如何執行,以及開發者和系統如何正確地使用dll,我們首先來研究一下dll的基本執行機理。下圖概括了dll的各構件是如何鏈結在一起的。現在,我們關注的焦點是可執行模組和dll模組之間是如何進行隱式鏈結的。隱式鏈結是目前最為常用的鏈結型別。windows同時支援顯示鏈結 顯示鏈結將在...
DLL(動態鏈結庫)程式設計
dll是現在常見的檔案,它整合了程式的很多功能在裡面。一般情況下,它不能直接被執行,常見的使用方法是用其他的 exe呼叫其執行,以使其內部功能表現出來。還有 ocx檔案也與之類似,也就是人們常說的com 1.簡要 windows api中所有的函式都包含在dll中,其中有3個最重要的dll。1 ke...