版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
動態(tài)鏈接庫
13.1DLL基礎(chǔ)知識本節(jié)講述DLL的基礎(chǔ)知識。13.1.1DLL概述 Windows系統(tǒng)平臺上提供了一種完全不同的有效的編程和運行環(huán)境,可以將獨立的程序模塊創(chuàng)建為較小的DLL(DynamicLinkableLibrary)文件,并可對它們單獨編譯和測試。在運行時,只有當(dāng)EXE程序確實要調(diào)用這些DLL模塊的情況下,系統(tǒng)才會將它們裝載到內(nèi)存空間中。這種方式不僅減少了EXE文件的大小和對內(nèi)存空間的需求,而且使這些DLL模塊可以同時被多個應(yīng)用程序使用。Windows自己就將一些主要的系統(tǒng)功能以DLL模塊的形式實現(xiàn)。13.1.2認(rèn)清DLL與LIB DLL與LIB的相似之處是它們都是將一部分可執(zhí)行代碼以及數(shù)據(jù)放在庫中供用戶程序使用,而且在使用時,這些代碼就象是用戶程序本身的一部分。LIB文件是靜態(tài)鏈接庫文件,在其中放置了許多的函數(shù)和變量。其中一部分函數(shù)和變量是供內(nèi)部使用的,在接口中不可見,即沒有輸出;另一部分是供接口使用的(當(dāng)然內(nèi)部函數(shù)也可以使用),外部可見,從而應(yīng)用程序可以調(diào)用這些輸出的函數(shù)和變量。在DLL中同樣包括許多變量和函數(shù),也分為內(nèi)部變量、函數(shù)和外部接口函數(shù)、變量。對于內(nèi)部的函數(shù)和變量,供DLL自己調(diào)用,因此并不包含名稱,只使用地址;對于供外部調(diào)用的函數(shù)和變量,在內(nèi)部的時候也使用地址,只是在頭文件中包含了輸出變量和函數(shù)的名稱,而且包含了這些名稱所對應(yīng)的地址,即將名稱和地址對應(yīng)起來。通過這些名稱就可以查找對應(yīng)變量和函數(shù)的地址(函數(shù)的地址是指函數(shù)入口點的地址)。13.1.3認(rèn)清DLL與EXEDLL和EXE都是Windows下的可執(zhí)行模塊,在對應(yīng)的文件結(jié)構(gòu)上,它們也類似的:具有文件頭,重定位信息表,導(dǎo)入動態(tài)庫表等,另外,DLL作為供程序調(diào)用的服務(wù)者,文件中還包含導(dǎo)出的函數(shù)表和變量表。DLL是服務(wù)的提供者,主要用來提供輸出變量和函數(shù)供別的程序調(diào)用,在DLL被裝入的時候,以及進(jìn)程中創(chuàng)建線程的時候,Windows都會以不同的參數(shù)調(diào)用入口點函數(shù),然后該函數(shù)進(jìn)行某些初始化工作后返回,DLL的執(zhí)行就停止了。Windows并不為DLL創(chuàng)建單獨的進(jìn)程空間,而是將其裝入共享地址,然后將其映射到不同的進(jìn)程供進(jìn)程調(diào)用,從而達(dá)到代碼共享的目的。EXE是DLL所提供服務(wù)的使用者,調(diào)用DLL中的輸出的函數(shù)和變量,每一個EXE在運行的時候,Windows均為它創(chuàng)建單獨的進(jìn)程環(huán)境,包括進(jìn)程地址空間,EXE就在它的地址空間中運行,對別的進(jìn)程是不透明的,因此也就無法為別的進(jìn)程調(diào)用,因此在許多情況下只能使用DLL來實現(xiàn)某些功能。13.1.4DLL的兩種動態(tài)鏈接方法加載時動態(tài)鏈接 由編譯系統(tǒng)完成對DLL的加載和應(yīng)用程序結(jié)束時DLL卸載的編碼(如還有其它程序使用該DLL,則Windows對DLL的應(yīng)用記錄減1,直到所有相關(guān)程序都結(jié)束對該DLL的使用時才釋放它),簡單實用,但不夠靈活,只能滿足一般要求。運行時動態(tài)鏈接 是由編程者用API函數(shù)加載和卸載DLL來達(dá)到調(diào)用DLL的目的,使用上較復(fù)雜,但能更加有效地使用內(nèi)存,是編制大型應(yīng)用程序時的重要方式。13.2DLL入/出口函數(shù) Win32DLL與Win16DLL有很大的區(qū)別,這主要是由操作系統(tǒng)的設(shè)計思想決定的。一方面,在Win16DLL中程序入口點函數(shù)和出口點函數(shù)(LibMain和WEP)是分別實現(xiàn)的;而在Win32DLL中卻由同一函數(shù)DLLMain來實現(xiàn)。無論何時,當(dāng)一個進(jìn)程或線程載入和卸載DLL時,都要調(diào)用該函數(shù)。13.2.1DllMain函數(shù)
每一個DLL必須有一個入口點,DLLMain是一個缺省的入口函數(shù)。DLLMain負(fù)責(zé)初始化(Initialization)和結(jié)束(Termination)工作,每當(dāng)一個新的進(jìn)程或者該進(jìn)程的新的線程訪問DLL時,或者訪問DLL的每一個進(jìn)程或者線程不再使用DLL或者結(jié)束時,都會調(diào)用DLLMain。但是,使用TerminateProcess或TerminateThread結(jié)束進(jìn)程或者線程,不會調(diào)用DLLMain。13.2.2MFCAppWizard生成的RegularDLL入/出口 MFCAppWizard生成的RegularDLL在后面的章節(jié)會有介紹,這里只討論它的入/出口點問題。 每個RegularDLL都有MFCAppWizard自動生成的CWinApp派生類的對象,與其它MFC應(yīng)用程序一樣,它是在CWinApp派生類的成員函數(shù)InitInstance和ExitInstance完成初始化和終止的工作。 實際上,MFC提供了一個基本的DllMain函數(shù),在這種DLL中不必自己編寫DllMain函數(shù),由MFC提供的這個函數(shù)在裝載DLL的時候調(diào)用InitInstance函數(shù),而在DLL退出的時候調(diào)用ExitInstance函數(shù)。所需要完成的初始化和終止的工作需要在這兩個函數(shù)中完成。13.3從DLL中導(dǎo)出函數(shù)
關(guān)于DLL的函數(shù)動態(tài)鏈接庫中定義有兩種函數(shù):導(dǎo)出函數(shù)(exportfunction)和內(nèi)部函數(shù)(internalfunction)。導(dǎo)出函數(shù)可以被其它模塊調(diào)用,內(nèi)部函數(shù)在定義它們的DLL程序內(nèi)部使用。13.3.1使用DEF文件導(dǎo)出函數(shù)
模塊定義文件(.DEF)是一個或多個用于描述DLL屬性的模塊語句組成的文本文件,每個DEF文件至少必須包含以下模塊定義語句:第一個語句必須是LIBRARY語句,指出DLL的名字;
EXPORTS語句列出被導(dǎo)出函數(shù)的名字;將要輸出的函數(shù)修飾名羅列在EXPORTS之下,這個名字必須與定義函數(shù)的名字完全一致,如此就得到一個沒有任何修飾的函數(shù)名了??梢允褂肈ESCRIPTION語句描述DLL的用途(此句可選);“;”對一行進(jìn)行注釋(可選)。13.3.2使用關(guān)鍵字_declspec(dllexport)
使用MFC提供的修飾符號_declspec(DLLexport)在要輸出的函數(shù)、類、數(shù)據(jù)的聲明前加上_declspec(DLLexport)的修飾符,表示輸出。__declspec(DLLexport)在C調(diào)用約定、C編譯情況下可以去掉輸出函數(shù)名的下劃線前綴。extern"C"使得在C++中使用C編譯方式成為可能。在C++下定義C函數(shù),需要加extern"C"關(guān)鍵詞。用extern"C"來指明該函數(shù)使用C編譯方式。輸出的C函數(shù)可以從C代碼里調(diào)用。13.3.3使用AFX_EXT_CLASS導(dǎo)出 MFC擴(kuò)展DLL使用AFX_EXT_CLASS來導(dǎo)出類,鏈接這種DLL的應(yīng)用程序或其他DLL使用這個宏來導(dǎo)入類。 如果用于DLL應(yīng)用程序的實現(xiàn)中,則表示輸出;如果用于使用DLL的應(yīng)用程序中,則表示輸入。要輸出整個的類,對類使用_declspec(_DLLexpot);要輸出類的成員函數(shù),則對該函數(shù)使用_declspec(_DLLexport)。13.4DLL中的數(shù)據(jù)和內(nèi)存13.4.1DLL多進(jìn)程間的數(shù)據(jù)共享 DLL被多個進(jìn)程調(diào)用,它的代碼從而被映射到不同的進(jìn)程內(nèi)存空間之中,DLL共享數(shù)據(jù)也盡量只在系統(tǒng)中有一個拷貝,這是通過COPY-ON-WRITE技術(shù)實現(xiàn)的。 使用共享數(shù)據(jù)段,首先需要把欲放入數(shù)據(jù)段的數(shù)據(jù)定義在特定的數(shù)據(jù)段中,然后在說明這個數(shù)據(jù)段是共享數(shù)據(jù)段就可以了。13.4.2DLL進(jìn)程中多線程間的數(shù)據(jù)隔離 WindowsAPI提供了進(jìn)程中多線程數(shù)據(jù)分離的一系列TLS(ThreadLocalStorage)函數(shù),這是進(jìn)程內(nèi)線程隔離的解決方法,TLS函數(shù)集共有四個函數(shù):DWORDTlsAlloc(VOID);BOOLTlsFree(DWORDdwTlsIndex);LPVOIDTlsGetValue(DWORDdwTlsIndex);BOOLTlsSetValue(DWORDdwTlsIndex,LPVOIDlpTlsValue);
函數(shù)TlsAlloc用來分配線程局部變量索引,它的返回值是后面三個函數(shù)的參數(shù)dwTlsIndex。而函數(shù)TlsFree負(fù)責(zé)釋放線程變量索引。所以這兩個函數(shù)應(yīng)該在副線程創(chuàng)建之前的主線程中調(diào)用。在DLL模塊中,就是在入口點函數(shù)被參數(shù)調(diào)用時候使用。 線程運行過程中,可以使用函數(shù)TlsGetValue和TlsSetValue根據(jù)線程變量的索引號存取各自的數(shù)據(jù)指針,并存取到各自的數(shù)據(jù)。13.5幾種常用的DLL MFC中的DLLa、Non-MFCDLL:指的是不用MFC的類庫結(jié)構(gòu),直接用C語言寫的DLL,其輸出的函數(shù)一般用的是標(biāo)準(zhǔn)C接口,并能被非MFC的應(yīng)用程序所調(diào)用。13.5.1Win32DLL VC6支持自動生成的Win32DLL和MFCAppWizardDLL,其中自動生成的Win32DLL共包括三種DLL工程。從FILE|NEW菜單項,選擇對話框中的Projects選項卡,圖13.1
選中Win32Dynamic-LinkLiabrary,輸入工程名,點擊OK按鈕后,彈出如下對話框圖13.2所示:選擇所要生成的Win32DLL類型了。13.5.2RegularstaticallylinkedtoMFCDLL
在VC6中有三種形式的MFCDLL(在該DLL中可以使用和繼承已有的MFC類)可供選擇,即RegularstaticallylinkedtoMFCDLL(標(biāo)準(zhǔn)靜態(tài)鏈接MFCDLL)和RegularusingthesharedMFCDLL(標(biāo)準(zhǔn)動態(tài)鏈接MFCDLL)以及ExtensionMFCDLL(擴(kuò)展MFCDLL)。 第一種DLL的特點是,在編譯時把使用的MFC代碼加入到DLL中,因此,在使用該程序時不需要其他MFC動態(tài)鏈接類庫的存在,但占用磁盤空間比較大;13.5.3RegularusingthesharedMFCDLL
第二種DLL的特點是:在運行時,動態(tài)鏈接到MFC類庫,因此減少了空間的占用,但是在運行時卻依賴于MFC動態(tài)鏈接類庫。動態(tài)鏈接到MFC的規(guī)則DLL應(yīng)用程序里頭的輸出函數(shù)可以被任意Win32程序使用,包括使用MFC的應(yīng)用程序。但是,所有從DLL輸出的函數(shù)應(yīng)該以如下語句開始:AFX_MANAGE_STATE(AfxGetStaticModuleState())此語句用來正確地切換MFC模塊狀態(tài)。13.5.4MFCExtensionDLL
第三種DLL的特點類似于第二種,作為MFC類庫的擴(kuò)展,只能被MFC程序使用。
ExtensionDLL用來實現(xiàn)從MFC所繼承下來的類的重新利用,就是說,用這種類型的動態(tài)連接庫,可以用來輸出一個從MFC所繼承下來的類。它輸出的函數(shù)僅可以被使用MFC且動態(tài)鏈接到MFC的應(yīng)用程序使用??梢詮腗FC繼承所想要的,更適于用戶自己用的類,并把它提供給應(yīng)用程序。也可隨意的給應(yīng)用程序提供MFC或MFC繼承類的對象指針。ExtensionDLL使用MFC的動態(tài)連接版本所創(chuàng)建的,并且它只被用MFC類庫所編寫的應(yīng)用程序所調(diào)用。13.6DLL的調(diào)用和調(diào)試13.6.1VC對DLL的調(diào)用
系統(tǒng)運行一個調(diào)用DLL的程序時,將在以下位置查找該DLL:1.包含EXE文件的目錄2.進(jìn)程的當(dāng)前工作目錄3.Windows系統(tǒng)目錄4.Windows目錄5.列在Path環(huán)境變量中的一系列目錄 若找不到該文件,系統(tǒng)將顯示對話框提示并終止程序的執(zhí)行,13.6.2VB對DLL的調(diào)用
在VB中調(diào)用WindowsDLL之前,必須在Standard(代碼)模塊的Declarations段中加一個特殊的聲明。對于一個DLL或API函數(shù),Declare語句是Windows所必需的,這一點很重要。并且在32位版的VB中動態(tài)鏈接庫中的函數(shù)對條件是很敏感的。13.6.3DLL的調(diào)試 DLL的調(diào)試有很多中方法,但都需要把DLL工程生成的后綴名為.dll的文件放在執(zhí)行它的應(yīng)用程序可以找到的目錄中。這可以有很多中方法,手工也行的。 應(yīng)用VC可以很容易地調(diào)試DLL,只要從DLL工程中運行調(diào)試程序即可。當(dāng)?shù)谝淮握{(diào)試DLL的時候,調(diào)試程序會跳出如下對話框圖13.5。13.7DLL例程13.7.1使用已有的DLL
本例程將通過調(diào)用DLL來實現(xiàn)程序的隱藏,即不顯示程序窗口,程序不顯示在任務(wù)欄上,在按下Ctrl+Alt+Del鍵后出現(xiàn)的任務(wù)列表中也不顯示。 首先創(chuàng)建工程:1.在VC++集成開發(fā)環(huán)境中,通過菜單File|New,彈出New對話框;2.在Projects選項卡中選擇MFCAppWizard(exe),在Projectname中輸入“Eg13_1”Location讀者可以自己選擇;3.按下OK按鈕,在彈出的MFCAppWizardStep-1對話框中選擇程序框架為單文檔框架,即選中SingleDocument;4.按下OK按鈕,在彈出的NewProjectInformation對話框中按下OK按鈕后等待創(chuàng)建完相應(yīng)的工程。參考課本260頁13.7.2資源DLL本例程將建立兩個DLL文件以實現(xiàn)自己的雙語菜單。首先創(chuàng)建工程Eg13_2:1.在VC++集成開發(fā)環(huán)境中,通過菜單File|New,彈出New對話框;2.在Projects選項卡中選擇MFCAppWizard(exe),在Projectname中輸入“Eg13_2”Location讀者可以自己選擇;3.按下OK按鈕,在彈出的MFCAppWizardStep-1對話框中選擇程序框架為單文檔框架,即選中SingleDocument;4.按下Finish按鈕,在彈出的NewProjectInformation對話框中按
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 27533-2024犬細(xì)小病毒病診斷技術(shù)
- TTK-PLK1-IN-1-生命科學(xué)試劑-MCE-9304
- Paroxetine-d4-BRL29060-d-sub-4-sub-生命科學(xué)試劑-MCE-2193
- KIF18A-IN-16-生命科學(xué)試劑-MCE-8155
- 4-5-MDAI-hydrochloride-生命科學(xué)試劑-MCE-4662
- 1-3-Dioctanoyl-glycerol-生命科學(xué)試劑-MCE-8665
- 二零二五年度獨占許可協(xié)議名詞詳釋與合同糾紛處理
- 二零二五年度企業(yè)注冊及市場營銷策劃合作協(xié)議
- 2025年度足浴店門面租賃合同模板(含供應(yīng)鏈管理)
- 二零二五年度股權(quán)分配與養(yǎng)老產(chǎn)業(yè)合作框架協(xié)議
- JTG 3362-2018公路鋼筋混凝土及預(yù)應(yīng)力混凝土橋涵設(shè)計規(guī)范
- 八年級下冊歷史思維導(dǎo)圖
- 電動汽車用驅(qū)動電機(jī)系統(tǒng)-編制說明
- 江蘇卷2024年高三3月份模擬考試化學(xué)試題含解析
- (正式版)JTT 1497-2024 公路橋梁塔柱施工平臺及通道安全技術(shù)要求
- 醫(yī)療器械物價收費申請流程
- 招聘專員轉(zhuǎn)正述職報告
- “一帶一路”背景下的西安市文化旅游外宣翻譯研究-基于生態(tài)翻譯學(xué)理論
- 2024年江蘇省昆山市六校中考聯(lián)考(一模)化學(xué)試題
- 大學(xué)生文學(xué)常識知識競賽考試題庫500題(含答案)
- 國家電網(wǎng)智能化規(guī)劃總報告
評論
0/150
提交評論