本文主要介紹dll文件的作用是什么(dll文件長什么樣),下面一起看看dll文件的作用是什么(dll文件長什么樣)相關(guān)資訊。
較大的應(yīng)用程序由許多模塊組成,這些模塊分別執(zhí)行相對獨立的功能,它們相互配合完成整個軟件系統(tǒng)的工作??赡軙幸恍┚哂型ㄓ霉δ艿哪K,在構(gòu)建其他軟件系統(tǒng)時仍然會用到。在構(gòu)造一個軟件系統(tǒng)時,如果把所有模塊的源代碼都靜態(tài)編譯成整個應(yīng)用測試。
windows系統(tǒng)平臺提供了一個完全不同的、更有效的編程和運行環(huán)境。您可以將獨立的程序模塊創(chuàng)建為較小的dll(動態(tài)鏈接庫)文件,并分別編譯和測試它們。在運行時,只有當(dāng)exe程序真正想要調(diào)用它們時,系統(tǒng)才會將這些dll模塊加載到內(nèi)存空間中。這種方法不僅減少了exe文件的大小和對內(nèi)存空間的需求,還使這些dll模塊能夠被多個應(yīng)用程序同時使用。windows本身以dll模塊的形式實現(xiàn)了一些主要的系統(tǒng)功能。
一般來說,dll是一種磁盤文件,可以。dll,。drv。豐,。sys和許多帶有。exe作為擴展名。它由全局?jǐn)?shù)據(jù)、服務(wù)函數(shù)和資源組成,在運行時被系統(tǒng)加載到調(diào)用進程的虛擬空間中,成為調(diào)用進程的一部分。如果與其他dll沒有,文件通常被映射到進程的虛擬空間中的同一個地址。dll模塊包含各種向外界提供服務(wù)的導(dǎo)出函數(shù)。dll可以有自己的數(shù)據(jù)段,但不能有自己的堆棧,使用與調(diào)用它的應(yīng)用程序相同的堆棧模式;一個dll在內(nèi)存中只有一個實例;dll實現(xiàn)代碼封裝;dll的編譯與具體的編程語言和編譯器無關(guān)。
在win32環(huán)境中,每個進程都復(fù)制自己的讀/寫全局變量。如果要與其他進程共享內(nèi)存,必須使用內(nèi)存映射文件或聲明一個共享數(shù)據(jù)段。dll模塊所需的堆棧內(nèi)存是從運行進程的堆棧中分配的。windows在加載dll模塊時將進程函數(shù)調(diào)用與dll文件的導(dǎo)出函數(shù)相匹配。windows操作系統(tǒng)對dll的操作只是映射dll。轉(zhuǎn)到需要它的進程的虛擬地址空間。dll函數(shù)中的代碼創(chuàng)建的任何對象(包括變量)都屬于調(diào)用它的線程或進程。
呼叫模式
1.靜態(tài)調(diào)用編譯器系統(tǒng)在應(yīng)用程序結(jié)束時完成加載dll和卸載dll的編碼(如果有其他程序使用該dll,則該dll在windows中的應(yīng)用記錄減1,直到所有相關(guān)程序都使用完該dll后才釋放,簡單實用,但不夠靈活,只能滿足一般要求。
隱式調(diào)用:您需要添加。生成應(yīng)用程序項目的動態(tài)鏈接庫時生成的lib文件。當(dāng)你想使用dll中的函數(shù)時,你只需要解釋它。隱式調(diào)用不需要調(diào)用loadlibrary和freelibrary。當(dāng)程序員創(chuàng)建一個dll文件時,鏈接器會自動生成一個對應(yīng)的lib導(dǎo)入文件。該文件包含每個dll導(dǎo)出函數(shù)的符號名和可選標(biāo)識號,但不包含實際代碼。lib文件作為dll的替代文件被編譯到應(yīng)用程序項目中。
程序員通過靜態(tài)鏈接編譯生成應(yīng)用程序時,應(yīng)用程序中的調(diào)用函數(shù)與lib文件中導(dǎo)出的符號相匹配,這些符號或標(biāo)識號進入生成的exe文件。lib文件還包含相應(yīng)的dl l文件名(但不是完整的路徑名),該文件名由鏈接器存儲在exe文件中。
當(dāng)應(yīng)用程序需要加載dll文件時,windows根據(jù)這些信息找到并加載dll,然后通過符號名或標(biāo)識號動態(tài)鏈接dll函數(shù)。加載應(yīng)用程序exe文件時,應(yīng)用程序調(diào)用的所有dll文件都將被加載到內(nèi)存中??蓤?zhí)行程序鏈接到輸入庫文件(。lib文件),包含有關(guān)dll輸出函數(shù)的信息。操作系統(tǒng)在加載可執(zhí)行程序時加載dll。可執(zhí)行程序通過函數(shù)名直接調(diào)用dll的輸出函數(shù),調(diào)用方法與程序內(nèi)部其他函數(shù)相同。
2.動態(tài)調(diào)用程序員用api函數(shù)加載和卸載dll,達到調(diào)用dll的目的,使用起來比較復(fù)雜,但可以更有效地利用內(nèi)存,是編譯大型應(yīng)用程序的重要。
顯式調(diào)用:指用mfc提供的loadlibrary或afxloadlibrary在應(yīng)用程序中顯式調(diào)用自己制作的動態(tài)鏈接庫,動態(tài)鏈接庫的文件名就是上述兩個函數(shù)的參數(shù),然后用getprocaddress獲取要引入的函數(shù)。從那時起,您可以調(diào)用這個傳入函數(shù),就像它是這個應(yīng)用程序的自定義函數(shù)一樣。在應(yīng)用中在程序退出之前,應(yīng)該使用mfc提供的freelibrary或者afxfreelibrary來釋放動態(tài)鏈接庫。直接調(diào)用win32的loadlibary函數(shù),并將dll的路徑指定為參數(shù)。loadlibary返回應(yīng)用程序在調(diào)用getprocaddress函數(shù)時使用的提示參數(shù)。getprocaddress函數(shù)將符號名或標(biāo)識號轉(zhuǎn)換成dll中的地址。程序員可以決定何時加載或不加載dll文件,顯式鏈接決定在運行時加載哪個dll文件。使用dll的程序在使用前必須加載dll以獲取某個dll模塊的句柄,然后調(diào)用getprocaddress函數(shù)獲取輸出函數(shù)的指針,退出前必須卸載dll (free loadlibrary)。
windows將按照下列搜索順序查找dll:
包含exe文件的目錄進程的當(dāng)前工作目錄windows系統(tǒng)目錄windows目錄是mfc中path環(huán)境變量dll中列出的一系列目錄。
非mfc dll:指不使用mfc類庫結(jié)構(gòu),直接用c語言編寫的dll,其輸出函數(shù)一般使用標(biāo)準(zhǔn)c接口,可以被非mfc或mfc編寫的應(yīng)用程序調(diào)用。常規(guī)dll:和下面描述的擴展dll一樣,是用mfc類庫寫的。明顯的特點是源文件中有一個繼承cwinapp的類??梢约毞譃殪o態(tài)連接mfc和動態(tài)連接mfc。靜態(tài)連接到mfc 的動態(tài)連接庫僅受vc 的專業(yè)版和企業(yè)版。任何win32程序都可以使用這種dll應(yīng)用程序中的輸出函數(shù),包括使用mfc的應(yīng)用程序。輸入函數(shù)具有以下形式:
外部和內(nèi)部c 導(dǎo)出您的exportedfunction;
沒有外在的 c 裝飾,輸出函數(shù)只能從c代碼調(diào)用。
dll應(yīng)用程序是從cwinapp派生的,但是沒有消息循環(huán)。
動態(tài)鏈接到mfc的常規(guī)dll應(yīng)用程序中的輸出函數(shù)可由任何win32程序使用,包括使用mfc的應(yīng)用程序。但是,dll的所有函數(shù)輸出都應(yīng)該以下面的語句開始:
此語句用于正確切換mfc模塊。狀態(tài)。
用支持dll技術(shù)的所有語言編寫的應(yīng)用程序都可以調(diào)用常規(guī)dll。在這個動態(tài)鏈接庫中,它必須有一個繼承自cwinapp的類,而dllmain函數(shù)是mfc提供的,所以不需要顯式編寫。
擴展dll:用來復(fù)用從mfc繼承的類,也就是這種類型的動態(tài)鏈接庫可以用來輸出從mfc繼承的類。它輸出的函數(shù)只能由使用mfc并動態(tài)鏈接到它的應(yīng)用程序使用。你可以從mfc中繼承你想要的,更適合自己使用的東西,提供給你的應(yīng)用。也可以隨意為應(yīng)用程序提供mfc或mfc繼承類對象指針。擴展dll是通過使用mfc的動態(tài)鏈接版本創(chuàng)建的,它僅由使用mfc類庫編寫的應(yīng)用程序調(diào)用。擴展dll不同于常規(guī)dll,因為它沒有從cwinapp繼承的類對象,所以必須為dllmain函數(shù)添加初始化代碼和結(jié)束代碼。
與常規(guī)dll相比,有以下不同之處:
1.它沒有從cwinapp派生的對象;
2.它必須有一個dllmain函數(shù);
3.當(dāng)dllmin調(diào)用afxinitextensionmodule函數(shù)時,需要檢查函數(shù)的返回值。如果它返回0,dllmmain也返回0;
4.如果它想要輸出cruntimeclass類型的對象或資源,它需要提供一個初始化函數(shù)來創(chuàng)建一個cdynlinklibrary對象。而且,需要輸出初始化函數(shù);
5.使用擴展dll的mfc應(yīng)用程序必須有一個從cwinapp派生的類,一般在initinstance中調(diào)用擴展dll的初始化函數(shù)。
dll入口函數(shù)
1.每個dll都必須有一個入口點,dllmain是一個默認(rèn)的入口函數(shù)。dllmain負責(zé)初始化和終止。每當(dāng)一個新進程或該進程的一個新線程訪問該dll時,或者每個訪問該dll的進程或線程不再使用該dll或結(jié)束時,將調(diào)用dllmain。但是,使用terminateprocess或terminatethread結(jié)束進程或線程不會調(diào)用dllmain。
dllmain的函數(shù)原型;
bool apientry dllmain(句柄hmodule,dword ul_reason_for_call,lpvoidlpreserved){ switch(ul _ reason _ for _ call){案例dll_process_attach:.......凱斯·dll_thread_attach:.......凱斯·dll_thread_detach:.......凱斯·dll_process_detach:.......返回true}}
參數(shù):
hmoudle:是調(diào)用動態(tài)庫時指向自身的句柄(其實是指向_dgroup段的選擇器);
ul_reason_for_call:是一個標(biāo)志,解釋為什么調(diào)用動態(tài)庫。當(dāng)進程或線程加載或卸載動態(tài)鏈接庫時。
標(biāo)簽:
函數(shù)調(diào)用應(yīng)用程序
了解更多dll文件的作用是什么(dll文件長什么樣)相關(guān)內(nèi)容請關(guān)注本站點。
投影儀畫面太小怎么放大(投影儀畫面怎么變小)
手機登錄路由器
系統(tǒng)還原鼠標(biāo)點不動怎么解決(電腦系統(tǒng)還原點)
1069070069發(fā)送失敗(1069009010021發(fā)送失敗)
怎樣關(guān)閉win8自動更新(win8.1怎么關(guān)閉更新)
dll文件有什么作用(dll文件長什么樣)
2.5k屏幕字體不清楚(2k屏字體模糊win10)
哪款筆記本打游戲好,華為筆記本游戲本哪款最好
附近修打印機維修,廣州哪里可以維修打印機的推薦一家信譽比較好的給我什么位置
魅族手表怎么樣好不好(魅族手表2021)
買電腦需要注意什么配置呢英語,買筆記本電腦要注意哪些配置
win8.1系統(tǒng)開機桌面部分圖標(biāo)不見了怎么恢復(fù)(win8開機桌面沒有圖標(biāo))
小米官網(wǎng)怎么看評論,小米官網(wǎng)怎么評價
至強cpu性能排行,現(xiàn)在最強的CPU和GPU型號
ios設(shè)置鎖屏壁紙怎么實現(xiàn),怎么設(shè)置蘋果手機壁紙
蘋果4s軟件晃動怎么辦,蘋果4S想刪除個程序怎么長按只會晃沒有小X啊怎么辦還是刪
車載無損音樂u盤質(zhì)量排名,網(wǎng)上賣的車載無損音樂u盤值得買嗎
曲面屏和平面屏哪個好 知乎(曲面屏和平面屏哪個耐用)
oppo互動功能(oppo手機互動在哪)
微軟發(fā)布linux發(fā)行版(微軟office linux)