动态链接库的创建
自從微軟推出16位的Windows操作系統(tǒng)起,此后每種版本的Windows操作系統(tǒng)都非常依賴于動(dòng)態(tài)鏈接庫(kù)(DLL)中的函數(shù)和數(shù)據(jù),實(shí)際上Windows操作系統(tǒng)中幾乎所有的內(nèi)容都由DLL以一種或另外一種形式代表著,例如顯示的字體和圖標(biāo)存儲(chǔ)在GDI DLL中、顯示W(wǎng)indows桌面和處理用戶的輸入所需要的代碼被存儲(chǔ)在一個(gè)User DLL中、Windows編程所需要的大量的API函數(shù)也被包含在Kernel DLL中。在Windows操作系統(tǒng)中使用DLL有很多優(yōu)點(diǎn),最主要的一點(diǎn)是多個(gè)應(yīng)用程序、甚至是不同語(yǔ)言編寫的應(yīng)用程序可以共享一個(gè)DLL文件,真正實(shí)現(xiàn)了資源"共享",大大縮小了應(yīng)用程序的執(zhí)行代碼,更加有效的利用了內(nèi)存;使用DLL的另一個(gè)優(yōu)點(diǎn)是DLL文件作為一個(gè)單獨(dú)的程序模塊,封裝性、獨(dú)立性好,在軟件需要升級(jí)的時(shí)候,開發(fā)人員只需要修改相應(yīng)的DLL文件就可以了,而且,當(dāng)DLL中的函數(shù)改變后,只要不是參數(shù)的改變,程序代碼并不需要重新編譯。這在編程時(shí)十分有用,大大提高了軟件開發(fā)和維護(hù)的效率。
既然DLL那么重要,所以搞清楚什么是DLL、如何在Windows操作系統(tǒng)中開發(fā)使用DLL是程序開發(fā)人員不得不解決的一個(gè)問(wèn)題。本實(shí)例針對(duì)這些問(wèn)題,通過(guò)一個(gè)簡(jiǎn)單的例子,即調(diào)用在一個(gè)DLL中函數(shù),實(shí)現(xiàn)用戶輸入數(shù)據(jù)的自加功能,全面地解析了在Visual C++編譯環(huán)境下編程實(shí)現(xiàn)DLL、調(diào)用DLL中的函數(shù)的過(guò)程。程序編譯運(yùn)行后的界面效果如圖一所示:
?
| ? 圖一、調(diào)用DLL中的函數(shù)實(shí)現(xiàn)數(shù)據(jù)自加功能程序效果圖 ? |
?
一、實(shí)現(xiàn)方法
1、DLL的概念
DLL是建立在客戶/服務(wù)器通信的概念上,包含若干函數(shù)、類或資源的庫(kù)文件,函數(shù)和數(shù)據(jù)被存儲(chǔ)在一個(gè)DLL(服務(wù)器)上并由一個(gè)或多個(gè)客戶導(dǎo)出而使用,這些客戶可以是應(yīng)用程序或者是其它的DLL。DLL庫(kù)不同于靜態(tài)庫(kù),在靜態(tài)庫(kù)情況下,函數(shù)和數(shù)據(jù)被編譯進(jìn)一個(gè)二進(jìn)制文件(通常擴(kuò)展名為*.LIB),Visual C++的編譯器在處理程序代碼時(shí)將從靜態(tài)庫(kù)中恢復(fù)這些函數(shù)和數(shù)據(jù)并把他們和應(yīng)用程序中的其他模塊組合在一起生成可執(zhí)行文件。這個(gè)過(guò)程稱為"靜態(tài)鏈接",此時(shí)因?yàn)閼?yīng)用程序所需的全部?jī)?nèi)容都是從庫(kù)中復(fù)制了出來(lái),所以靜態(tài)庫(kù)本身并不需要與可執(zhí)行文件一起發(fā)行。在動(dòng)態(tài)庫(kù)的情況下,有兩個(gè)文件,一個(gè)是引入庫(kù)(.LIB)文件,一個(gè)是DLL文件,引入庫(kù)文件包含被DLL導(dǎo)出的函數(shù)的名稱和位置,DLL包含實(shí)際的函數(shù)和數(shù)據(jù),應(yīng)用程序使用LIB文件鏈接到所需要使用的DLL文件,庫(kù)中的函數(shù)和數(shù)據(jù)并不復(fù)制到可執(zhí)行文件中,因此在應(yīng)用程序的可執(zhí)行文件中,存放的不是被調(diào)用的函數(shù)代碼,而是DLL中所要調(diào)用的函數(shù)的內(nèi)存地址,這樣當(dāng)一個(gè)或多個(gè)應(yīng)用程序運(yùn)行是再把程序代碼和被調(diào)用的函數(shù)代碼鏈接起來(lái),從而節(jié)省了內(nèi)存資源。從上面的說(shuō)明可以看出,DLL和.LIB文件必須隨應(yīng)用程序一起發(fā)行,否則應(yīng)用程序?qū)?huì)產(chǎn)生錯(cuò)誤。
微軟的Visual C++支持三種DLL,它們分別是Non-MFC Dll(非MFC動(dòng)態(tài)庫(kù))、Regular Dll(常規(guī)DLL)、Extension Dll(擴(kuò)展DLL)。Non-MFC DLL指的是不用MFC的類庫(kù)結(jié)構(gòu),直接用C語(yǔ)言寫的DLL,其導(dǎo)出的函數(shù)是標(biāo)準(zhǔn)的C接口,能被非MFC或MFC編寫的應(yīng)用程序所調(diào)用。Regular DLL:和下述的Extension Dlls一樣,是用MFC類庫(kù)編寫的,它的一個(gè)明顯的特點(diǎn)是在源文件里有一個(gè)繼承CWinApp的類(注意:此類DLL雖然從CWinApp派生,但沒(méi)有消息循環(huán)),被導(dǎo)出的函數(shù)是C函數(shù)、C++類或者C++成員函數(shù)(注意不要把術(shù)語(yǔ)C++類與MFC的微軟基礎(chǔ)C++類相混淆),調(diào)用常規(guī)DLL的應(yīng)用程序不必是MFC應(yīng)用程序,只要是能調(diào)用類C函數(shù)的應(yīng)用程序就可以,它們可以是在Visual C++、Dephi、Visual Basic、Borland C等編譯環(huán)境下利用DLL開發(fā)應(yīng)用程序。常規(guī)DLL又可細(xì)分成靜態(tài)鏈接到MFC和動(dòng)態(tài)鏈接到MFC上的,這兩種常規(guī)DLL的區(qū)別將在下面介紹。與常規(guī)DLL相比,使用擴(kuò)展DLL用于導(dǎo)出增強(qiáng)MFC基礎(chǔ)類的函數(shù)或子類,用這種類型的動(dòng)態(tài)鏈接庫(kù),可以用來(lái)輸出一個(gè)從MFC所繼承下來(lái)的類。擴(kuò)展DLL是使用MFC的動(dòng)態(tài)鏈接版本所創(chuàng)建的,并且它只被用MFC類庫(kù)所編寫的應(yīng)用程序所調(diào)用。例如你已經(jīng)創(chuàng)建了一個(gè)從MFC的CtoolBar類的派生類用于創(chuàng)建一個(gè)新的工具欄,為了導(dǎo)出這個(gè)類,你必須把它放到一個(gè)MFC擴(kuò)展的DLL中。擴(kuò)展DLL 和常規(guī)DLL不一樣,它沒(méi)有一個(gè)從CWinApp繼承而來(lái)的類的對(duì)象,所以,開發(fā)人員必須在DLL中的DllMain函數(shù)添加初始化代碼和結(jié)束代碼。
2、動(dòng)態(tài)鏈接庫(kù)的創(chuàng)建 在Visual C++6.0開發(fā)環(huán)境下,打開File\New\Project選項(xiàng),可以選擇Win32 Dynamic-Link Library或MFC AppWizard[dll]來(lái)以不同的方式來(lái)創(chuàng)建Non-MFC Dll、Regular Dll、Extension Dll等不同種類的動(dòng)態(tài)鏈接庫(kù)。
(一) Win32 Dynamic-Link Library方式創(chuàng)建Non-MFC DLL動(dòng)態(tài)鏈接庫(kù)
每一個(gè)DLL必須有一個(gè)入口點(diǎn),這就象我們用C編寫的應(yīng)用程序一樣,必須有一個(gè)WINMAIN函數(shù)一樣。在Non-MFC DLL中DllMain是一個(gè)缺省的入口函數(shù),你不需要編寫自己的DLL入口函數(shù),用這個(gè)缺省的入口函數(shù)就能使動(dòng)態(tài)鏈接庫(kù)被調(diào)用時(shí)得到正確的初始化。如果應(yīng)用程序的DLL需要分配額外的內(nèi)存或資源時(shí),或者說(shuō)需要對(duì)每個(gè)進(jìn)程或線程初始化和清除操作時(shí),需要在相應(yīng)的DLL工程的.CPP文件中對(duì)DllMain()函數(shù)按照下面的格式書寫。
轉(zhuǎn)載于:https://blog.51cto.com/jiudingsoft/853689
總結(jié)
- 上一篇: 字符统计1
- 下一篇: 4th, Jan 2012 食物中毒惊魂