動(dòng)態(tài)連接庫設(shè)計(jì)_第1頁
動(dòng)態(tài)連接庫設(shè)計(jì)_第2頁
動(dòng)態(tài)連接庫設(shè)計(jì)_第3頁
動(dòng)態(tài)連接庫設(shè)計(jì)_第4頁
動(dòng)態(tài)連接庫設(shè)計(jì)_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、網(wǎng)絡(luò)編程與開發(fā)技術(shù)網(wǎng)絡(luò)編程與開發(fā)技術(shù) 天津職業(yè)技術(shù)師范大學(xué)天津職業(yè)技術(shù)師范大學(xué)信息學(xué)院信息學(xué)院第六章第六章 動(dòng)態(tài)連接庫設(shè)計(jì)動(dòng)態(tài)連接庫設(shè)計(jì)內(nèi)內(nèi) 容容 提提 要要1 1、動(dòng)態(tài)連接庫的特點(diǎn)、動(dòng)態(tài)連接庫的特點(diǎn)2 2、創(chuàng)建動(dòng)態(tài)連接庫、創(chuàng)建動(dòng)態(tài)連接庫3 3、調(diào)用動(dòng)態(tài)連接庫、調(diào)用動(dòng)態(tài)連接庫4 4、動(dòng)態(tài)連接庫在網(wǎng)絡(luò)程序中的應(yīng)用、動(dòng)態(tài)連接庫在網(wǎng)絡(luò)程序中的應(yīng)用6.1 6.1 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn) 第六章第六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn) 動(dòng)態(tài)連接庫(動(dòng)態(tài)連接庫(Dynamic-Link Library)是一些編譯過的可執(zhí)行代碼)是一些編譯過的可執(zhí)行代碼模塊,可以在應(yīng)用程序中或其它模塊,可以在應(yīng)用

2、程序中或其它DLL中被調(diào)用,是中被調(diào)用,是Windows的重要組成的重要組成要素。動(dòng)態(tài)連接庫是一個(gè)包括了若干函數(shù)的可執(zhí)行模塊,其包含的函數(shù)要素。動(dòng)態(tài)連接庫是一個(gè)包括了若干函數(shù)的可執(zhí)行模塊,其包含的函數(shù)可以由可以由Windows應(yīng)用程序調(diào)用以執(zhí)行一些功能。應(yīng)用程序調(diào)用以執(zhí)行一些功能。Windows內(nèi)核的三個(gè)模內(nèi)核的三個(gè)模塊塊USER.EXE、KENERL.EXE和和GDI.EXE實(shí)際上都是動(dòng)態(tài)連接庫,分實(shí)際上都是動(dòng)態(tài)連接庫,分別提供用戶消息服務(wù)、進(jìn)程管理、圖形輸出等服務(wù)。在別提供用戶消息服務(wù)、進(jìn)程管理、圖形輸出等服務(wù)。在WindowsSystem目錄下,凡是以目錄下,凡是以.DLL、.DRV、.

3、FON、.SYS和許多以和許多以.EXE為擴(kuò)展名的為擴(kuò)展名的系統(tǒng)文件都是動(dòng)態(tài)連接庫。系統(tǒng)文件都是動(dòng)態(tài)連接庫。 多個(gè)應(yīng)用程序可以同時(shí)調(diào)用同一個(gè)動(dòng)態(tài)連接庫時(shí),內(nèi)存中只有該動(dòng)多個(gè)應(yīng)用程序可以同時(shí)調(diào)用同一個(gè)動(dòng)態(tài)連接庫時(shí),內(nèi)存中只有該動(dòng)態(tài)連接庫的一個(gè)實(shí)例,這使系統(tǒng)能高效經(jīng)濟(jì)地使用內(nèi)存。動(dòng)態(tài)連接庫中態(tài)連接庫的一個(gè)實(shí)例,這使系統(tǒng)能高效經(jīng)濟(jì)地使用內(nèi)存。動(dòng)態(tài)連接庫中的執(zhí)行模塊與調(diào)用它的應(yīng)用程序是完全分開的。幾個(gè)函數(shù)可以放于一個(gè)的執(zhí)行模塊與調(diào)用它的應(yīng)用程序是完全分開的。幾個(gè)函數(shù)可以放于一個(gè)動(dòng)態(tài)連接庫中,應(yīng)用程序使用這些函數(shù),就象它們是應(yīng)用程序可執(zhí)行代動(dòng)態(tài)連接庫中,應(yīng)用程序使用這些函數(shù),就象它們是應(yīng)用程序可執(zhí)行代碼

4、的一部分。碼的一部分。 6.1 6.1 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn) 第六章第六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn) 升級到升級到 DLL 更為容易。更為容易。DLL中的函數(shù)更改時(shí),只要函數(shù)的參數(shù)和返中的函數(shù)更改時(shí),只要函數(shù)的參數(shù)和返回值沒有更改,就不需重新編譯或重新鏈接使用它們的應(yīng)用程序。相回值沒有更改,就不需重新編譯或重新鏈接使用它們的應(yīng)用程序。相反,靜態(tài)鏈接的對象代碼要求在函數(shù)更改時(shí)重新鏈接應(yīng)用程序。反,靜態(tài)鏈接的對象代碼要求在函數(shù)更改時(shí)重新鏈接應(yīng)用程序。 動(dòng)態(tài)連接庫可以有自己的數(shù)據(jù)段,但沒有自己的堆棧,動(dòng)態(tài)連接動(dòng)態(tài)連接庫可以有自己的數(shù)據(jù)段,但沒有自己的堆棧,動(dòng)態(tài)連接庫與調(diào)用它的應(yīng)用

5、程序使用相同的堆棧模式,這減少了編程設(shè)計(jì)上的庫與調(diào)用它的應(yīng)用程序使用相同的堆棧模式,這減少了編程設(shè)計(jì)上的不便。同時(shí)動(dòng)態(tài)連接庫實(shí)現(xiàn)了代碼的封裝性,使得程序簡潔明晰。不便。同時(shí)動(dòng)態(tài)連接庫實(shí)現(xiàn)了代碼的封裝性,使得程序簡潔明晰。 支持動(dòng)態(tài)連接庫的創(chuàng)建與具體的編程語言及編譯器無關(guān),只要遵支持動(dòng)態(tài)連接庫的創(chuàng)建與具體的編程語言及編譯器無關(guān),只要遵守動(dòng)態(tài)連接庫的開發(fā)規(guī)范和編程策略,并安排正確的調(diào)用接口,不論守動(dòng)態(tài)連接庫的開發(fā)規(guī)范和編程策略,并安排正確的調(diào)用接口,不論用何種編程語言編制的動(dòng)態(tài)連接庫都具有通用性。例如在用何種編程語言編制的動(dòng)態(tài)連接庫都具有通用性。例如在VC中編制的中編制的動(dòng)態(tài)連接庫程序,可用于動(dòng)態(tài)

6、連接庫程序,可用于BC、VB、Delphi等多種語言環(huán)境中。等多種語言環(huán)境中。 6.1 6.1 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn) 第六章第六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn) 動(dòng)態(tài)連接庫函數(shù)可以被任何編程語言編寫的應(yīng)用程序所調(diào)用,只要?jiǎng)討B(tài)連接庫函數(shù)可以被任何編程語言編寫的應(yīng)用程序所調(diào)用,只要應(yīng)用程序使用統(tǒng)一的函數(shù)調(diào)用規(guī)則,即程序與應(yīng)用程序使用統(tǒng)一的函數(shù)調(diào)用規(guī)則,即程序與 DLL 函數(shù)在下列方面必函數(shù)在下列方面必須是兼容的:函數(shù)期望其參數(shù)被推送到堆棧上的順序,是函數(shù)還是應(yīng)須是兼容的:函數(shù)期望其參數(shù)被推送到堆棧上的順序,是函數(shù)還是應(yīng)用程序負(fù)責(zé)清理堆棧,以及寄存器中是否傳遞了任何參數(shù)。用程序負(fù)責(zé)清

7、理堆棧,以及寄存器中是否傳遞了任何參數(shù)。 動(dòng)態(tài)連接庫中雖然包含了函數(shù)的目標(biāo)代碼,但動(dòng)態(tài)連接庫中的函數(shù)動(dòng)態(tài)連接庫中雖然包含了函數(shù)的目標(biāo)代碼,但動(dòng)態(tài)連接庫中的函數(shù)代碼是不被包含在應(yīng)用程序中的,應(yīng)用程序只是簡單地記錄了函數(shù)的代碼是不被包含在應(yīng)用程序中的,應(yīng)用程序只是簡單地記錄了函數(shù)的位置信息(即包含于哪個(gè)動(dòng)態(tài)連接庫中以及在動(dòng)態(tài)連接庫中的位置)。位置信息(即包含于哪個(gè)動(dòng)態(tài)連接庫中以及在動(dòng)態(tài)連接庫中的位置)。有了這些信息后,程序在執(zhí)行時(shí),即可找到該函數(shù)的目標(biāo)代碼。如果有了這些信息后,程序在執(zhí)行時(shí),即可找到該函數(shù)的目標(biāo)代碼。如果應(yīng)用程序在運(yùn)行時(shí)系統(tǒng)不能找到所需動(dòng)態(tài)連接庫,則動(dòng)態(tài)連接庫提供應(yīng)用程序在運(yùn)行時(shí)系

8、統(tǒng)不能找到所需動(dòng)態(tài)連接庫,則動(dòng)態(tài)連接庫提供的功能對應(yīng)用程序來說將是不可用的,甚至?xí)虼私K止程序的運(yùn)行。的功能對應(yīng)用程序來說將是不可用的,甚至?xí)虼私K止程序的運(yùn)行。 6.2 6.2 創(chuàng)建動(dòng)態(tài)連接庫創(chuàng)建動(dòng)態(tài)連接庫 第五章第五章 多線程結(jié)構(gòu)的網(wǎng)絡(luò)編程多線程結(jié)構(gòu)的網(wǎng)絡(luò)編程源代碼文件(源代碼文件(.c.c)的結(jié)構(gòu))的結(jié)構(gòu)模塊定義文件(模塊定義文件(.DEF.DEF)的結(jié)構(gòu)和各段的意義)的結(jié)構(gòu)和各段的意義函數(shù)聲明文件函數(shù)聲明文件工程文件工程文件6.2.1 6.2.1 源代碼文件(源代碼文件(.c.c)的結(jié)構(gòu))的結(jié)構(gòu) 第六章第六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn) 通常,動(dòng)態(tài)連接庫由一個(gè)或更多的源代碼文件(

9、通常,動(dòng)態(tài)連接庫由一個(gè)或更多的源代碼文件(.c.c)、一)、一個(gè)模塊定義文件(個(gè)模塊定義文件(.def.def文件)、一個(gè)函數(shù)聲明文件(文件)、一個(gè)函數(shù)聲明文件(.H.H)、以及)、以及一個(gè)工程文件(一個(gè)工程文件(.PRJ.PRJ)組成)組成 。 源代碼文件中主要包含動(dòng)態(tài)連接庫內(nèi)部函數(shù)的定義,內(nèi)部源代碼文件中主要包含動(dòng)態(tài)連接庫內(nèi)部函數(shù)的定義,內(nèi)部函數(shù)一般包括三種:入口函數(shù)、輸出函數(shù)和終止函數(shù)。函數(shù)一般包括三種:入口函數(shù)、輸出函數(shù)和終止函數(shù)。6.2.1 6.2.1 源代碼文件(源代碼文件(.c.c)的結(jié)構(gòu))的結(jié)構(gòu) 第六章第六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn)源代碼文件具體結(jié)構(gòu)示例如下:源代碼文

10、件具體結(jié)構(gòu)示例如下:#include #include /入口函數(shù)入口函數(shù)int FAR PASCAL LibMain ( HANDLE hInstance, WORD wDataSeg, WORD int FAR PASCAL LibMain ( HANDLE hInstance, WORD wDataSeg, WORD cbHeapSize, LPSTR lpszCmdLinecbHeapSize, LPSTR lpszCmdLine ) ) if (cbHeapSizeif (cbHeapSize!=0) !=0) UnlockData(0); UnlockData(0); /解鎖數(shù)據(jù)段

11、解鎖數(shù)據(jù)段/此處可進(jìn)行一些用戶必要的初始化工作此處可進(jìn)行一些用戶必要的初始化工作return return (1 1); ; /輸出函數(shù)輸出函數(shù)int FAR PASCAL ExportFunction1 (int param1,.,char paramint FAR PASCAL ExportFunction1 (int param1,.,char param n) n) /. C/. C語言應(yīng)用程序語言應(yīng)用程序 /終止函數(shù)終止函數(shù)/ /int FAR PASCAL WEP ( int /int FAR PASCAL WEP ( int /* *SystemExitSystemExit* *

12、/ ) / ) return(1); return(1); 6.2.1 6.2.1 源代碼文件(源代碼文件(.c.c)的結(jié)構(gòu))的結(jié)構(gòu) 第六章第六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn)以上各組成部分及參數(shù)的含義:以上各組成部分及參數(shù)的含義:1)Windows.h1)Windows.h頭文件,它包含有數(shù)據(jù)類型的定義、頭文件,它包含有數(shù)據(jù)類型的定義、APIAPI入口點(diǎn)定義和其它有用的入口點(diǎn)定義和其它有用的參數(shù)信息。參數(shù)信息。2)PASCAL2)PASCAL說明符定義該程序的傳遞參數(shù)和凈化堆棧的協(xié)定(注意:說明符定義該程序的傳遞參數(shù)和凈化堆棧的協(xié)定(注意:DLLDLL外部傳外部傳送的指針必須是遠(yuǎn)指針?biāo)偷?/p>

13、指針必須是遠(yuǎn)指針FARFAR)。)。3)LibMain3)LibMain函數(shù)就象函數(shù)就象C C程序中的程序中的Main()Main()一樣,是一樣,是DLLDLL的入口函數(shù),的入口函數(shù),WindowsWindows每次每次加載加載DLLDLL時(shí)都要執(zhí)行時(shí)都要執(zhí)行LibMainLibMain( )( )函數(shù),它主要用來進(jìn)行一些初始化工作。函數(shù),它主要用來進(jìn)行一些初始化工作。LibMainLibMain帶四個(gè)參數(shù):帶四個(gè)參數(shù):hInstancehInstance、 wDataSegwDataSeg、cbHeapSizecbHeapSize和和lpszCmdLinelpszCmdLine。hInst

14、ancehInstance是是DLLDLL事例句柄。事例句柄。wDataSegwDataSeg參數(shù)是數(shù)據(jù)段(參數(shù)是數(shù)據(jù)段(DSDS)寄存器值。)寄存器值。cbHeapSizecbHeapSize參數(shù)是在模塊定義文件中定義的堆的大小,參數(shù)是在模塊定義文件中定義的堆的大小,LibMainLibMain 使用該使用該值使本地堆初始化。值使本地堆初始化。lpszCmdLinelpszCmdLine參數(shù)包括命令行信息,但很少被參數(shù)包括命令行信息,但很少被DLLDLL使用。使用。 一般來說,這四個(gè)參數(shù)是制作一般來說,這四個(gè)參數(shù)是制作DLLDLL通用的參數(shù)。通用的參數(shù)。 如果不想讓如果不想讓DLLDLL數(shù)據(jù)

15、被封住,數(shù)據(jù)被封住,那么必須調(diào)用那么必須調(diào)用unlockdataunlockdata恢復(fù)正常的非鎖狀態(tài),如果恢復(fù)正常的非鎖狀態(tài),如果DLLDLL初始化已經(jīng)成功,初始化已經(jīng)成功,DLLDLL則則返回返回1 1,若不成功則返回,若不成功則返回0 0值,且值,且 DLLDLL退出系統(tǒng)。退出系統(tǒng)。6.2.1 6.2.1 源代碼文件(源代碼文件(.c.c)的結(jié)構(gòu))的結(jié)構(gòu) 第六章第六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn)4) ExportFunction1 4) ExportFunction1 是是DLLDLL的一個(gè)輸出函數(shù),實(shí)現(xiàn)用戶所要完的一個(gè)輸出函數(shù),實(shí)現(xiàn)用戶所要完成的任務(wù),這部分是成的任務(wù),這部分是D

16、LLDLL的核心。它與一般的核心。它與一般C C語言程序相似,但是語言程序相似,但是所有的外部指針都是遠(yuǎn)指針?biāo)械耐獠恐羔樁际沁h(yuǎn)指針FARFAR。一個(gè)。一個(gè)DLLDLL中可以有多個(gè)輸出函數(shù)。中可以有多個(gè)輸出函數(shù)。5) WEP5) WEP函數(shù)是函數(shù)是DLLDLL的終止函數(shù),終止函數(shù)有時(shí)稱為退出函數(shù),它的終止函數(shù),終止函數(shù)有時(shí)稱為退出函數(shù),它的名字必須是的名字必須是WEPWEP,且它可以被包括在,且它可以被包括在DLLDLL模塊定義文件的模塊定義文件的EXPORTSEXPORTS段中。段中。WindowsWindows從內(nèi)存中卸載從內(nèi)存中卸載DLLDLL時(shí),調(diào)用相應(yīng)的出口函數(shù)時(shí),調(diào)用相應(yīng)的出口函數(shù)

17、WEP( )WEP( ),主要做一些清理工作,如釋放占用的內(nèi)存資源;丟棄某些字串、主要做一些清理工作,如釋放占用的內(nèi)存資源;丟棄某些字串、位圖等資源;關(guān)閉打開的文件等等。位圖等資源;關(guān)閉打開的文件等等。6.2.2 6.2.2 模塊定義文件(模塊定義文件(.DEF.DEF)的結(jié)構(gòu)和各段的意義)的結(jié)構(gòu)和各段的意義 第六章第六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn)LIBRARY example LIBRARY example DESCRIPTION example.DLL DESCRIPTION example.DLL EXETYPE WINDOWS EXETYPE WINDOWS CODE PREL

18、OAD MOVEABLE DISCARDABLE CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD MOVEABLE SINGLE DATA PRELOAD MOVEABLE SINGLE HEAPSIZE 1024 HEAPSIZE 1024 EXPORTS EXPORTS ExportFunction1 1 ExportFunction1 1 WEP 2 WEP 2 以上各組成部分及參數(shù)的含義:以上各組成部分及參數(shù)的含義:1) 1) 關(guān)鍵字關(guān)鍵字LIBRARYLIBRARY是把這個(gè)模塊視為一個(gè)是把這個(gè)模塊視為一個(gè)DLLDLL,庫的名字,庫的名字e

19、xampleexample跟在跟在其后,且必須與該庫的名字、其后,且必須與該庫的名字、DEFDEF中的中的DLLDLL的文件名相一致。的文件名相一致。2) DESCRIPTION2) DESCRIPTION語句采用一個(gè)字符串,其長度可達(dá)語句采用一個(gè)字符串,其長度可達(dá)128128個(gè)字符,通常個(gè)字符,通常用它來保存模塊描述的信息。用它來保存模塊描述的信息。 6.2.2 6.2.2 模塊定義文件(模塊定義文件(.DEF.DEF)的結(jié)構(gòu)和各段的意義)的結(jié)構(gòu)和各段的意義 第六章第六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn)3) EXETYPE windows3) EXETYPE windows語句表明動(dòng)態(tài)庫類

20、型。語句表明動(dòng)態(tài)庫類型。4) CODE4) CODE語句定義該庫代碼段的內(nèi)存屬性,語句定義該庫代碼段的內(nèi)存屬性,MOVEABLEMOVEABLE允許內(nèi)存管理程序在必允許內(nèi)存管理程序在必要時(shí)移動(dòng)代碼段,要時(shí)移動(dòng)代碼段,DISCARDABLEDISCARDABLE表明系統(tǒng)在必要時(shí)可以釋放代碼段空間。表明系統(tǒng)在必要時(shí)可以釋放代碼段空間。5) DATA5) DATA語句定義該庫數(shù)據(jù)段的內(nèi)存屬性,關(guān)鍵字語句定義該庫數(shù)據(jù)段的內(nèi)存屬性,關(guān)鍵字MOVEABLEMOVEABLE允許內(nèi)存管理程允許內(nèi)存管理程序在必要時(shí)移動(dòng)內(nèi)存段,關(guān)鍵字序在必要時(shí)移動(dòng)內(nèi)存段,關(guān)鍵字SINGLESINGLE是是DLLDLL必要,因?yàn)楸?/p>

21、要,因?yàn)镈LLDLL總是有一個(gè)單一數(shù)總是有一個(gè)單一數(shù)據(jù)段,而不管訪問它的應(yīng)用程序的數(shù)量。據(jù)段,而不管訪問它的應(yīng)用程序的數(shù)量。6) HEAPSIZE6) HEAPSIZE語句用來定義一個(gè)語句用來定義一個(gè)DLLDLL局部堆的初始規(guī)模,執(zhí)行局部內(nèi)存分配的局部堆的初始規(guī)模,執(zhí)行局部內(nèi)存分配的DLLDLL必須在庫啟動(dòng)時(shí)使該堆初始化,堆的大小被傳送給必須在庫啟動(dòng)時(shí)使該堆初始化,堆的大小被傳送給DLLDLL的的LiEntryLiEntry的程序。的程序。然后用該堆的大小調(diào)用然后用該堆的大小調(diào)用LocallnitLocallnit使使DLLDLL的局部堆初始化。的局部堆初始化。 7) EXEPORTS7) E

22、XEPORTS語句列出動(dòng)態(tài)連接庫中可以被其它模塊調(diào)用的輸出函數(shù)的名字語句列出動(dòng)態(tài)連接庫中可以被其它模塊調(diào)用的輸出函數(shù)的名字和序號,系統(tǒng)利用這個(gè)信息建立一個(gè)序數(shù)入口值,序數(shù)入口值是一個(gè)優(yōu)化的值,和序號,系統(tǒng)利用這個(gè)信息建立一個(gè)序數(shù)入口值,序數(shù)入口值是一個(gè)優(yōu)化的值,允許動(dòng)態(tài)連接機(jī)制更快塊操作且使用較少的內(nèi)存。允許動(dòng)態(tài)連接機(jī)制更快塊操作且使用較少的內(nèi)存。 一般來說,模塊定義文件(一般來說,模塊定義文件(.DEF.DEF)的結(jié)構(gòu)除取動(dòng)態(tài)庫的名字不同外,其它結(jié))的結(jié)構(gòu)除取動(dòng)態(tài)庫的名字不同外,其它結(jié)構(gòu)都是固定的。動(dòng)態(tài)連接庫模塊定義文件用語產(chǎn)生輸入文件(構(gòu)都是固定的。動(dòng)態(tài)連接庫模塊定義文件用語產(chǎn)生輸入文件(

23、.lib.lib)和輸出庫)和輸出庫文件(文件(.exp.exp)。連接器使用輸出文件建立)。連接器使用輸出文件建立.dll.dll文件。文件。 6.2.3 6.2.3 函數(shù)聲明文件(函數(shù)聲明文件(.H.H)第六章第六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn)原形函數(shù)的功能是進(jìn)一步聲明調(diào)用函數(shù)的函數(shù)名和傳遞的參數(shù),原形函數(shù)的功能是進(jìn)一步聲明調(diào)用函數(shù)的函數(shù)名和傳遞的參數(shù),其形式為:其形式為: int FAR PASCAL ExportFunction1(int param1,.,char paramint FAR PASCAL ExportFunction1(int param1,.,char par

24、am n) ; n) ; 6.2.4 6.2.4 工程文件(工程文件(.PRJ.PRJ)第六章第六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn)工程文件包含有工程文件包含有example.Cexample.C、example.DEFexample.DEF兩個(gè)文件,編譯連接兩個(gè)文件,編譯連接工程文件最終生成動(dòng)態(tài)鏈接庫文件。工程文件最終生成動(dòng)態(tài)鏈接庫文件。 6.3 6.3 調(diào)用動(dòng)態(tài)連接庫調(diào)用動(dòng)態(tài)連接庫 第五章第五章 多線程結(jié)構(gòu)的網(wǎng)絡(luò)編程多線程結(jié)構(gòu)的網(wǎng)絡(luò)編程隱式鏈接方式加載隱式鏈接方式加載DLLDLL顯示方式加載顯示方式加載DLLDLL6.3 6.3 調(diào)用動(dòng)態(tài)庫調(diào)用動(dòng)態(tài)庫第六章第六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接

25、庫的特點(diǎn)調(diào)用調(diào)用DLLDLL中函數(shù)的方法有兩種:中函數(shù)的方法有兩種:隱式鏈接:隱式鏈接:即系統(tǒng)在加載應(yīng)用程序的同時(shí)加載該程序所需的即系統(tǒng)在加載應(yīng)用程序的同時(shí)加載該程序所需的DLLDLL。當(dāng)程序運(yùn)行結(jié)束時(shí),系統(tǒng)負(fù)責(zé)卸載當(dāng)程序運(yùn)行結(jié)束時(shí),系統(tǒng)負(fù)責(zé)卸載DLLDLL(如還有其它程序使用該(如還有其它程序使用該DLLDLL,則系統(tǒng)對,則系統(tǒng)對DLLDLL的應(yīng)用記錄減的應(yīng)用記錄減1 1,直到所有相關(guān)程序都結(jié)束對該,直到所有相關(guān)程序都結(jié)束對該DLLDLL的使用時(shí)才完全釋放它)。在這種方式下,應(yīng)用程序需要將的使用時(shí)才完全釋放它)。在這種方式下,應(yīng)用程序需要將DLLDLL輸入庫(輸入庫(.Lib.Lib)與應(yīng)用

26、程序相連接,或者在應(yīng)用程序模塊定義)與應(yīng)用程序相連接,或者在應(yīng)用程序模塊定義文件中,用文件中,用IMPORTSIMPORTS語句列出所要調(diào)用語句列出所要調(diào)用DLLDLL的函數(shù)名。的函數(shù)名。顯式鏈接:顯式鏈接:通過使用通過使用Win32 APIWin32 API函數(shù)來加載和卸載函數(shù)來加載和卸載DLLDLL以達(dá)到調(diào)以達(dá)到調(diào)用用DLLDLL的目的。的目的。 兩種方法均保留了兩種方法均保留了DLLDLL的優(yōu)點(diǎn):可修改的優(yōu)點(diǎn):可修改DLLDLL而不需要重新編譯而不需要重新編譯連接應(yīng)用程序;同時(shí)被多個(gè)應(yīng)用程序調(diào)用;節(jié)省內(nèi)存和磁盤空間連接應(yīng)用程序;同時(shí)被多個(gè)應(yīng)用程序調(diào)用;節(jié)省內(nèi)存和磁盤空間的使用。的使用。

27、6.3.1 6.3.1 隱式鏈接方式加載隱式鏈接方式加載DLLDLL 第六章第六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn) 隱式鏈接是隱式鏈接是Win32 APIWin32 API普遍使用的方法。編譯器在編譯應(yīng)用程序源普遍使用的方法。編譯器在編譯應(yīng)用程序源代碼時(shí),如果源代碼調(diào)用任何外部函數(shù)(包括代碼時(shí),如果源代碼調(diào)用任何外部函數(shù)(包括DLLDLL函數(shù)和代碼在另一個(gè)函數(shù)和代碼在另一個(gè)目標(biāo)模塊中的函數(shù)),則產(chǎn)生的目標(biāo)碼中僅包含對外部函數(shù)的引用。隨目標(biāo)模塊中的函數(shù)),則產(chǎn)生的目標(biāo)碼中僅包含對外部函數(shù)的引用。隨后,在對目標(biāo)碼進(jìn)行連接時(shí),如果連接器發(fā)現(xiàn)引用的外部函數(shù)存在于某后,在對目標(biāo)碼進(jìn)行連接時(shí),如果連接器

28、發(fā)現(xiàn)引用的外部函數(shù)存在于某個(gè)輸入庫(個(gè)輸入庫(.Lib.Lib)或在應(yīng)用程序模塊定義文件的)或在應(yīng)用程序模塊定義文件的IMPORTSIMPORTS語句中,它便語句中,它便認(rèn)為該外部函數(shù)是認(rèn)為該外部函數(shù)是DLLDLL中的函數(shù),因此只是簡單地在可執(zhí)行文件中加入中的函數(shù),因此只是簡單地在可執(zhí)行文件中加入DLLDLL的存放地址信息。的存放地址信息。 當(dāng)運(yùn)行不包含隱式鏈接信息的應(yīng)用程序時(shí),系統(tǒng)將應(yīng)用程序中所有當(dāng)運(yùn)行不包含隱式鏈接信息的應(yīng)用程序時(shí),系統(tǒng)將應(yīng)用程序中所有的代碼和數(shù)據(jù)一次性映射到內(nèi)存中。如果應(yīng)用程序包含對隱式鏈接的引的代碼和數(shù)據(jù)一次性映射到內(nèi)存中。如果應(yīng)用程序包含對隱式鏈接的引用,系統(tǒng)則必須先

29、處理引用的信息。系統(tǒng)將應(yīng)用程序所使用的用,系統(tǒng)則必須先處理引用的信息。系統(tǒng)將應(yīng)用程序所使用的DLLDLL可執(zhí)可執(zhí)行模塊映射到進(jìn)程的地址空間中,修改進(jìn)程的執(zhí)行代碼,提供行模塊映射到進(jìn)程的地址空間中,修改進(jìn)程的執(zhí)行代碼,提供DLLDLL函數(shù)函數(shù)的地址。同應(yīng)用程序其它代碼一樣,的地址。同應(yīng)用程序其它代碼一樣,DLLDLL代碼在應(yīng)用程序啟動(dòng)時(shí)被映射代碼在應(yīng)用程序啟動(dòng)時(shí)被映射到內(nèi)存空間中,并且僅當(dāng)需要時(shí)才裝入內(nèi)存。到內(nèi)存空間中,并且僅當(dāng)需要時(shí)才裝入內(nèi)存。 6.3.1 6.3.1 隱式鏈接方式加載隱式鏈接方式加載DLLDLL 第六章第六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn)當(dāng)程序啟動(dòng)時(shí),系統(tǒng)首先搜索一組預(yù)安

30、裝的當(dāng)程序啟動(dòng)時(shí),系統(tǒng)首先搜索一組預(yù)安裝的DLLDLL,如性能庫,如性能庫 (KERNEL32.DLL) (KERNEL32.DLL) 和安全庫和安全庫 (USER32.DLL)(USER32.DLL),然后按下列順序搜索,然后按下列順序搜索 DLLDLL:1)1)當(dāng)前進(jìn)程的可執(zhí)行模塊所在的目錄。當(dāng)前進(jìn)程的可執(zhí)行模塊所在的目錄。2)2)當(dāng)前目錄當(dāng)前目錄3)Windows3)Windows系統(tǒng)目錄。系統(tǒng)目錄。GetSystemDirectoryGetSystemDirectory 函數(shù)檢索此目錄的路徑。函數(shù)檢索此目錄的路徑。4)Windows4)Windows目錄。目錄。GetWindowsDi

31、rectoryGetWindowsDirectory 函數(shù)檢索此目錄的路徑。函數(shù)檢索此目錄的路徑。5)PATH 5)PATH 環(huán)境變量中列出的目錄。環(huán)境變量中列出的目錄。 在啟動(dòng)應(yīng)用程序時(shí),如果按照以上路徑均未能找到所需的在啟動(dòng)應(yīng)用程序時(shí),如果按照以上路徑均未能找到所需的DLLDLL,則,則系統(tǒng)終止程序并報(bào)告錯(cuò)誤。如果找到所有的系統(tǒng)終止程序并報(bào)告錯(cuò)誤。如果找到所有的DLLDLL,則,則DLLDLL模塊被映射到進(jìn)模塊被映射到進(jìn)程的內(nèi)存空間中,進(jìn)程通過調(diào)用程的內(nèi)存空間中,進(jìn)程通過調(diào)用LibMainLibMain函數(shù)與每個(gè)函數(shù)與每個(gè)DLLDLL相連,如果調(diào)用相連,如果調(diào)用LibMainLibMain

32、函數(shù)失敗,程序也將被終止。一旦函數(shù)失敗,程序也將被終止。一旦DLLDLL被映射到內(nèi)存中,系統(tǒng)便被映射到內(nèi)存中,系統(tǒng)便通知應(yīng)用程序到何處去找它所需要的通知應(yīng)用程序到何處去找它所需要的DLLDLL函數(shù)。函數(shù)。6.3.1 6.3.1 隱式鏈接方式加載隱式鏈接方式加載DLLDLL 第六章第六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn)下面給出隱式鏈接的示例:下面給出隱式鏈接的示例:IMPORTS example.ExportFunction1 IMPORTS example.ExportFunction1 #include #include mainmain()() ExportFunction1( Expo

33、rtFunction1(); /); /調(diào)用動(dòng)態(tài)庫中的輸出函數(shù)調(diào)用動(dòng)態(tài)庫中的輸出函數(shù) I M P O R T SI M P O R T S 語 句 列 出 了 程 序 所 需 要 的語 句 列 出 了 程 序 所 需 要 的 D L LD L L 及 其 函 數(shù)及 其 函 數(shù)ExportFunction1ExportFunction1,除此之外,程序也可以通過與,除此之外,程序也可以通過與exampleexample的輸入的輸入庫(庫(example.libexample.lib)相連來引用)相連來引用DLLDLL函數(shù),這種情況下,函數(shù),這種情況下,IMPORTSIMPORTS語句將被省略。語

34、句將被省略。 6.3.2 6.3.2 顯示方式加載顯示方式加載DLL DLL 第六章第六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn) 顯式鏈接方式不需要將程序與輸入庫(顯式鏈接方式不需要將程序與輸入庫(.Lib.Lib)相連,也不需)相連,也不需要在程序的模塊定義文件中使用要在程序的模塊定義文件中使用IMPORTSIMPORTS語句來解決對語句來解決對DLLDLL函數(shù)的函數(shù)的引用,因?yàn)槌绦虿灰燥@示的方式調(diào)用引用,因?yàn)槌绦虿灰燥@示的方式調(diào)用DLLDLL函數(shù),因而不產(chǎn)生外部函數(shù),因而不產(chǎn)生外部引用。顯式鏈接方式是指應(yīng)用程序在運(yùn)行時(shí),通過引用。顯式鏈接方式是指應(yīng)用程序在運(yùn)行時(shí),通過LoadLibraryLo

35、adLibrary函數(shù)顯式地加載自己所需的函數(shù)顯式地加載自己所需的DLLDLL,再用,再用GetProcAddressGetProcAddress函數(shù)獲取函數(shù)獲取DLLDLL函數(shù)的入口地址,并將該地址賦予函數(shù)指針,利用函數(shù)指針,函數(shù)的入口地址,并將該地址賦予函數(shù)指針,利用函數(shù)指針,就可以象調(diào)用應(yīng)用程序內(nèi)部函數(shù)一樣來調(diào)用外部就可以象調(diào)用應(yīng)用程序內(nèi)部函數(shù)一樣來調(diào)用外部DLLDLL函數(shù)了。在函數(shù)了。在應(yīng)用程序結(jié)束之前,應(yīng)該用應(yīng)用程序結(jié)束之前,應(yīng)該用FreeLibraryFreeLibrary函數(shù)來釋放動(dòng)態(tài)連接庫。函數(shù)來釋放動(dòng)態(tài)連接庫。 6.3.2 6.3.2 顯示方式加載顯示方式加載DLL DLL

36、第六章第六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn)顯示鏈接方式所需要的幾個(gè)主要顯示鏈接方式所需要的幾個(gè)主要APIAPI函數(shù)的定義及說明如下:函數(shù)的定義及說明如下:(1 1)加載動(dòng)態(tài)鏈接庫函數(shù))加載動(dòng)態(tài)鏈接庫函數(shù) HMODULE LoadLibraryHMODULE LoadLibrary( LPCTSTR( LPCTSTR lpFileNamelpFileName);); lpFileName lpFileName為要載入的動(dòng)態(tài)鏈接庫的名稱為要載入的動(dòng)態(tài)鏈接庫的名稱 進(jìn)程調(diào)用進(jìn)程調(diào)用 LoadLibraryLoadLibrary以顯式鏈接到以顯式鏈接到 DLLDLL。如果成功,函數(shù)將指定的。如果成

37、功,函數(shù)將指定的 DLL DLL 映射到調(diào)用進(jìn)程的地址空間中并返回此映射到調(diào)用進(jìn)程的地址空間中并返回此 DLL DLL 的句柄,該句柄可與用于顯式鏈的句柄,該句柄可與用于顯式鏈接的其他函數(shù)(如接的其他函數(shù)(如 GetProcAddressGetProcAddress 和和 FreeLibraryFreeLibrary)一起使用。)一起使用。LoadLibraryLoadLibrary 嘗試使用用于隱式鏈接的同一搜索序列來定位嘗試使用用于隱式鏈接的同一搜索序列來定位 DLLDLL。如果系統(tǒng)無。如果系統(tǒng)無法找到法找到 DLL DLL 或者入口點(diǎn)函數(shù)返回或者入口點(diǎn)函數(shù)返回 FALSEFALSE,Lo

38、adLibraryLoadLibrary 將返回將返回 NULLNULL。如果對。如果對 LoadLibraryLoadLibrary 的調(diào)用所指定的的調(diào)用所指定的 DLL DLL 模塊已映射到調(diào)用進(jìn)程的地址空間中,則模塊已映射到調(diào)用進(jìn)程的地址空間中,則函數(shù)僅返回函數(shù)僅返回 DLL DLL 的句柄并遞增模塊的引用數(shù)。的句柄并遞增模塊的引用數(shù)。 如果如果 DLL DLL 有入口點(diǎn)函數(shù)(有入口點(diǎn)函數(shù)(LibMainLibMain),則操作系統(tǒng)在調(diào)用),則操作系統(tǒng)在調(diào)用 LoadLibraryLoadLibrary 的進(jìn)的進(jìn)程上中調(diào)用此函數(shù)。如果由于以前調(diào)用了程上中調(diào)用此函數(shù)。如果由于以前調(diào)用了 L

39、oadLibraryLoadLibrary 但沒有相應(yīng)地調(diào)用但沒有相應(yīng)地調(diào)用 FreeLibraryFreeLibrary 函數(shù)而導(dǎo)致函數(shù)而導(dǎo)致 DLL DLL 已經(jīng)附加到進(jìn)程,則不會(huì)調(diào)用此入口點(diǎn)函數(shù)。已經(jīng)附加到進(jìn)程,則不會(huì)調(diào)用此入口點(diǎn)函數(shù)。 如果出于某種原因如果出于某種原因 Windows Windows 無法加載無法加載 DLLDLL,進(jìn)程可以嘗試從錯(cuò)誤恢復(fù)。,進(jìn)程可以嘗試從錯(cuò)誤恢復(fù)。例如,進(jìn)程可通知用戶所發(fā)生的錯(cuò)誤,并讓用戶指定例如,進(jìn)程可通知用戶所發(fā)生的錯(cuò)誤,并讓用戶指定 DLL DLL 的其他路徑。的其他路徑。 6.3.2 6.3.2 顯示方式加載顯示方式加載DLL DLL 第六章第

40、六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn)(2 2)獲?。┇@取 DLLDLL函數(shù)地址函數(shù)地址FARPROC GetProcAddress( HMODULE hModule, LPCSTR lpProcNameFARPROC GetProcAddress( HMODULE hModule, LPCSTR lpProcName);); hModulehModule:動(dòng)態(tài)鏈接庫句柄動(dòng)態(tài)鏈接庫句柄lpProcNamelpProcName :DLLDLL函數(shù)名稱或輸出順序編號函數(shù)名稱或輸出順序編號顯式鏈接到顯式鏈接到 DLLDLL的進(jìn)程調(diào)用的進(jìn)程調(diào)用 GetProcAddressGetProcAddress

41、 來獲取來獲取 DLLDLL輸出函數(shù)的地輸出函數(shù)的地址。使用返回的函數(shù)指針調(diào)用址。使用返回的函數(shù)指針調(diào)用 DLL DLL 函數(shù)。函數(shù)。GetProcAddressGetProcAddress 將將DLLDLL模塊模塊句柄和要調(diào)用的函數(shù)名或函數(shù)的輸出序號用作參數(shù)。句柄和要調(diào)用的函數(shù)名或函數(shù)的輸出序號用作參數(shù)。 僅當(dāng)要鏈接的僅當(dāng)要鏈接的 DLLDLL是用模塊定義是用模塊定義 (.DEF) (.DEF) 文件生成的,并且序號文件生成的,并且序號在在.DEF.DEF文件的文件的EXPORTSEXPORTS節(jié)中與函數(shù)一起列出時(shí),才能獲取輸出序號。如節(jié)中與函數(shù)一起列出時(shí),才能獲取輸出序號。如果果 DLL

42、DLL 具有許多輸出函數(shù),則相對于使用函數(shù)名,使用輸出序號調(diào)用具有許多輸出函數(shù),則相對于使用函數(shù)名,使用輸出序號調(diào)用 GetProcAddressGetProcAddress 的速度稍快一些,因?yàn)檩敵鲂蛱柺堑乃俣壬钥煲恍驗(yàn)檩敵鲂蛱柺?DLL DLL 導(dǎo)出表的索引。導(dǎo)出表的索引。使用輸出序號,使用輸出序號,GetProcAddressGetProcAddress 可直接定位函數(shù),而不是將指定名稱可直接定位函數(shù),而不是將指定名稱與與 DLL DLL 導(dǎo)出表中的函數(shù)名進(jìn)行比較。但是,僅當(dāng)有權(quán)控制導(dǎo)出表中的函數(shù)名進(jìn)行比較。但是,僅當(dāng)有權(quán)控制 .DEF .DEF 文件文件中導(dǎo)出函數(shù)的序號分配時(shí),才應(yīng)

43、使用輸出序號調(diào)用中導(dǎo)出函數(shù)的序號分配時(shí),才應(yīng)使用輸出序號調(diào)用 GetProcAddressGetProcAddress。 6.3.2 6.3.2 顯示方式加載顯示方式加載DLL DLL 第六章第六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn)(3 3)釋放)釋放DLLDLLBOOL FreeLibrary( HMODULE hModuleBOOL FreeLibrary( HMODULE hModule ) ) /hModule/hModule為動(dòng)態(tài)鏈接庫句柄為動(dòng)態(tài)鏈接庫句柄 不再需要不再需要DLLDLL模塊時(shí),顯式鏈接到模塊時(shí),顯式鏈接到 DLL DLL 的進(jìn)程調(diào)用的進(jìn)程調(diào)用 FreeLibraryF

44、reeLibrary 函數(shù)釋放函數(shù)釋放DLLDLL。此函數(shù)遞減模塊的引用數(shù),如果引用數(shù)為零,此函數(shù)便。此函數(shù)遞減模塊的引用數(shù),如果引用數(shù)為零,此函數(shù)便從進(jìn)程的地址空間中取消模塊的映射。下面給出顯式鏈接的示例:從進(jìn)程的地址空間中取消模塊的映射。下面給出顯式鏈接的示例:HANDLE hLibraryHANDLE hLibrary; ;FARPROC lpFuncFARPROC lpFunc; ;int RetValueint RetValue; ;hLibrary=LoadLibrary(example.dllhLibrary=LoadLibrary(example.dll); ); /加載加載D

45、LLDLLif(hLibraryif(hLibrary!=NULL) !=NULL) /加載成功加載成功 /檢取檢取ExportFunction1ExportFunction1函數(shù)地址,并將地址賦予函數(shù)地址,并將地址賦予lpFunclpFunc函數(shù)指針函數(shù)指針 lpFunclpFunc=GetProcAddress(hLibrary,“ExportFunction1”); =GetProcAddress(hLibrary,“ExportFunction1”); if(lpFunc if(lpFunc!=(FARPROC)NULL) !=(FARPROC)NULL) /檢取成功則調(diào)用檢取成功則調(diào)

46、用 RetValue =(RetValue =(* *lpFunclpFunc)()(); ); /通過函數(shù)指針調(diào)用函數(shù)通過函數(shù)指針調(diào)用函數(shù) FreeLibrary(hLibraryFreeLibrary(hLibrary); ); /釋放占用的內(nèi)存釋放占用的內(nèi)存 6.4 6.4 動(dòng)態(tài)連接庫在網(wǎng)絡(luò)程序中的應(yīng)用動(dòng)態(tài)連接庫在網(wǎng)絡(luò)程序中的應(yīng)用 第六章第六章 動(dòng)態(tài)連接庫的特點(diǎn)動(dòng)態(tài)連接庫的特點(diǎn) 動(dòng)態(tài)連接庫技術(shù)存在于動(dòng)態(tài)連接庫技術(shù)存在于WindowsWindows應(yīng)用的方方面面,在網(wǎng)絡(luò)通信中同應(yīng)用的方方面面,在網(wǎng)絡(luò)通信中同樣也得到了廣泛的應(yīng)用。在樣也得到了廣泛的應(yīng)用。在WindowsWindows下下Wi

47、ndows SocketsWindows Sockets的功能都是通過的功能都是通過動(dòng)態(tài)連接庫(動(dòng)態(tài)連接庫(DLLDLL)來實(shí)現(xiàn)的,因此也常常將)來實(shí)現(xiàn)的,因此也常常將Windows SocketsWindows Sockets實(shí)現(xiàn)成為實(shí)現(xiàn)成為Windows Sockets DLLWindows Sockets DLL(Winsock.dllWinsock.dll)。)。 在一個(gè)大型網(wǎng)絡(luò)程序設(shè)計(jì)的過程中,往往需要將整個(gè)系統(tǒng)劃分為若在一個(gè)大型網(wǎng)絡(luò)程序設(shè)計(jì)的過程中,往往需要將整個(gè)系統(tǒng)劃分為若干個(gè)小的模塊,這樣有利于小組內(nèi)部成員的分工與合作。在這些模塊中,干個(gè)小的模塊,這樣有利于小組內(nèi)部成員的分工與

48、合作。在這些模塊中,通常將其中的一個(gè)模塊作為主程序的基本框架或底板,其它模塊的功能通常將其中的一個(gè)模塊作為主程序的基本框架或底板,其它模塊的功能以以DLLDLL形式予以實(shí)現(xiàn)。程序運(yùn)行時(shí),框架程序或底板根據(jù)需要選擇性地形式予以實(shí)現(xiàn)。程序運(yùn)行時(shí),框架程序或底板根據(jù)需要選擇性地裝入所需的裝入所需的dlldll。這種開發(fā)模式更接近于面向?qū)ο蟮某绦蛟O(shè)計(jì)思想。模。這種開發(fā)模式更接近于面向?qū)ο蟮某绦蛟O(shè)計(jì)思想。模塊和模塊之間更關(guān)注于功能,而非技術(shù)實(shí)現(xiàn)細(xì)節(jié)。例如為了實(shí)現(xiàn)局域網(wǎng)塊和模塊之間更關(guān)注于功能,而非技術(shù)實(shí)現(xiàn)細(xì)節(jié)。例如為了實(shí)現(xiàn)局域網(wǎng)內(nèi)兩臺(tái)機(jī)器的通信,可以采用內(nèi)兩臺(tái)機(jī)器的通信,可以采用NetBiosNetBios、WinsockWinsock、IPXIPX等多種通信協(xié)議,等多種通信協(xié)議,程序員可以根據(jù)實(shí)際情況選擇其中的一種通信協(xié)議予以實(shí)現(xiàn),并將

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論