Windows應(yīng)用程序與動(dòng)態(tài)鏈接庫(kù)

Windows應(yīng)用程序與動(dòng)態(tài)鏈接庫(kù)

ID:38860230

大小:331.31 KB

頁(yè)數(shù):16頁(yè)

時(shí)間:2019-06-20

Windows應(yīng)用程序與動(dòng)態(tài)鏈接庫(kù)_第1頁(yè)
Windows應(yīng)用程序與動(dòng)態(tài)鏈接庫(kù)_第2頁(yè)
Windows應(yīng)用程序與動(dòng)態(tài)鏈接庫(kù)_第3頁(yè)
Windows應(yīng)用程序與動(dòng)態(tài)鏈接庫(kù)_第4頁(yè)
Windows應(yīng)用程序與動(dòng)態(tài)鏈接庫(kù)_第5頁(yè)
資源描述:

《Windows應(yīng)用程序與動(dòng)態(tài)鏈接庫(kù)》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。

1、Windows應(yīng)用程序與動(dòng)態(tài)鏈接庫(kù)DLL簡(jiǎn)介DLL是一個(gè)可以執(zhí)行的并可以被多個(gè)Windows應(yīng)用程序共享的程序模塊(稱(chēng)為Module),模塊中包含了一些可以被多個(gè)Windows應(yīng)用程序或DLL共享的代碼、數(shù)據(jù)和資源。動(dòng)態(tài)連接庫(kù)文件的擴(kuò)展名一般是dll,也有可能是drv,sys和fon(它們分別對(duì)應(yīng)的是設(shè)備驅(qū)動(dòng)文件、系統(tǒng)文件和字體資源文件)。DLL可以有自己的數(shù)據(jù)段,但沒(méi)有自己的堆棧,使用與調(diào)用它的應(yīng)用程序相同的堆棧模式.DLL簡(jiǎn)介DLL是Windows最重要的組成要素,Windows中的許多新功能、新特性都是通過(guò)DLL來(lái)實(shí)

2、現(xiàn)的Windows本身就是由許多的DLL組成的,它最基本的三大組成模塊Kernel、GDI和User都是DLL,它所有的庫(kù)模塊也都設(shè)計(jì)成DLL。凡以.DLL、.DRV、.SYS和許多以.EXE為擴(kuò)展名的系統(tǒng)文件都是DLL,打開(kāi)WindowsSystem目錄,就可以看到許多的DLL模塊。靜態(tài)鏈接和動(dòng)態(tài)鏈接(1)靜態(tài)鏈接傳統(tǒng)的庫(kù)函數(shù)是通過(guò)靜態(tài)鏈接鏈到應(yīng)用程序中的。這些庫(kù)函數(shù)可能來(lái)自編程語(yǔ)言提供的標(biāo)準(zhǔn)庫(kù),也可能是由操作系統(tǒng)提供的API。靜態(tài)鏈接和動(dòng)態(tài)鏈接動(dòng)態(tài)鏈接是指在把應(yīng)用程序的目標(biāo)代碼鏈接成EXE文件時(shí)并沒(méi)有將函數(shù)庫(kù)中的函數(shù)

3、復(fù)制到應(yīng)用程序的可執(zhí)行文件中,而是在程序運(yùn)行時(shí)動(dòng)態(tài)地加載所需的函數(shù)。(2)動(dòng)態(tài)鏈接DLL特點(diǎn)一個(gè)DLL在內(nèi)存中只有一個(gè)實(shí)例,使之能高效經(jīng)濟(jì)地使用內(nèi)存,降低可共享代碼的內(nèi)存使用量;DLL實(shí)現(xiàn)的代碼封裝性,使得程序簡(jiǎn)潔明晰,提供給每個(gè)程序組一致的APIs讓用戶(hù)進(jìn)行調(diào)用,在用戶(hù)程序運(yùn)行時(shí)被載入;DLL的編制與具體的編程語(yǔ)言及編譯器無(wú)關(guān),只要遵守DLL的開(kāi)發(fā)規(guī)范和編程策略,并安排正確的調(diào)用接口,不管用何種編程語(yǔ)言編制的DLL都具有通用性。創(chuàng)建DLL創(chuàng)建帶有輸出原型/結(jié)構(gòu)/符號(hào)的頭文件創(chuàng)建實(shí)現(xiàn)輸出函數(shù)/變量的C/C++源文件編譯器為

4、每個(gè)C/C++源文件生成.obj文件鏈接程序結(jié)合.obj模塊以生成DLL如果至上有一個(gè)函數(shù)/變量輸出,則鏈接程序同時(shí)也生成.lib文件DLL的調(diào)用隱式調(diào)用隱式調(diào)用又稱(chēng)靜態(tài)調(diào)用或裝載時(shí)調(diào)用,對(duì)應(yīng)于DLL的靜態(tài)載入。要在應(yīng)用程序中隱式調(diào)用某個(gè)動(dòng)態(tài)鏈接庫(kù)中的函數(shù),一般要做以下兩件事情:(1)用extern子句聲明要調(diào)用的過(guò)程或函數(shù)及其所在的DLL文件名;(2)在應(yīng)用程序中直接調(diào)用用extern子句聲明的過(guò)程DLL的調(diào)用顯示調(diào)用定義一個(gè)與調(diào)用函數(shù)一致的函數(shù)類(lèi)型;用LoadLibrary或SafeLoadLibrary函數(shù)動(dòng)態(tài)載入動(dòng)

5、態(tài)鏈接庫(kù);用GetProcAddress得到要調(diào)用的函數(shù)或過(guò)程的地址;利用定義的函數(shù)類(lèi)型生成一個(gè)同類(lèi)型的函數(shù)變量;進(jìn)行函數(shù)調(diào)用;利用FreeLibrary函數(shù)卸載動(dòng)態(tài)鏈接庫(kù)。DLL的調(diào)用顯示調(diào)用(只需獲得DLL文件,并且知道要調(diào)用的函數(shù)名和參數(shù))先用LoadLibrary加載dll,再用GetProcAddress檢索所需的函數(shù)句柄,并且顯式地用FreeLibrary卸載。隱式調(diào)用(需要.dll文件和生存的.lib庫(kù))應(yīng)用程序鏈接前將.dll文件拷入應(yīng)用程序的debug中,并將.lib文件引入。DLL的導(dǎo)入和導(dǎo)出DLL包含

6、一個(gè)導(dǎo)出函數(shù)表,函數(shù)表包含了函數(shù)在DLL內(nèi)的地址,可以通過(guò)函數(shù)的符號(hào)化名字和稱(chēng)為序號(hào)的整數(shù)識(shí)別這些函數(shù)??蛻?hù)程序首先裝入DLL時(shí)并不知道要調(diào)用的函數(shù)地址,但知道符號(hào)名或序號(hào)。動(dòng)態(tài)鏈接的進(jìn)程建立一張表,把客戶(hù)的調(diào)用和DLL里的函數(shù)地址連結(jié)起來(lái)。在DLL代碼中,必須顯示聲明導(dǎo)出函數(shù):_declspec(dllexport)voidFunc(char[],DWORD)應(yīng)用程序方面需要聲明對(duì)應(yīng)的導(dǎo)入函數(shù):_declspec(dllimport)voidFunc(char[],DWORD)DLL函數(shù)的入口地址BOOLWINAPIDl

7、lMain//函數(shù)名DllMain是區(qū)分大小寫(xiě)的(HANDLEhinstDll,//包含了DLL的實(shí)例句柄DWORDfdwReason,//系統(tǒng)調(diào)用該函數(shù)的原因LPVOIDlpReserved)//0表示顯示鏈接,非0表示隱式示例:編寫(xiě)一個(gè)簡(jiǎn)單的DLL模塊并在用戶(hù)程序中進(jìn)行調(diào)用示例運(yùn)行結(jié)果:實(shí)驗(yàn)四創(chuàng)建一個(gè)DLL模塊實(shí)現(xiàn)兩個(gè)正整數(shù)的相加功能,創(chuàng)建一個(gè)應(yīng)用程序調(diào)用該DLL模塊

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶(hù)上傳,版權(quán)歸屬用戶(hù),天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶(hù)請(qǐng)聯(lián)系客服處理。