dll文件有什么作用(dll文件長(zhǎng)什么樣)

發(fā)布時(shí)間:2024-02-17
本文主要介紹dll文件的作用是什么(dll文件長(zhǎng)什么樣),下面一起看看dll文件的作用是什么(dll文件長(zhǎng)什么樣)相關(guān)資訊。
較大的應(yīng)用程序由許多模塊組成,這些模塊分別執(zhí)行相對(duì)獨(dú)立的功能,它們相互配合完成整個(gè)軟件系統(tǒng)的工作??赡軙?huì)有一些具有通用功能的模塊,在構(gòu)建其他軟件系統(tǒng)時(shí)仍然會(huì)用到。在構(gòu)造一個(gè)軟件系統(tǒng)時(shí),如果把所有模塊的源代碼都靜態(tài)編譯成整個(gè)應(yīng)用測(cè)試。
windows系統(tǒng)平臺(tái)提供了一個(gè)完全不同的、更有效的編程和運(yùn)行環(huán)境。您可以將獨(dú)立的程序模塊創(chuàng)建為較小的dll(動(dòng)態(tài)鏈接庫(kù))文件,并分別編譯和測(cè)試它們。在運(yùn)行時(shí),只有當(dāng)exe程序真正想要調(diào)用它們時(shí),系統(tǒng)才會(huì)將這些dll模塊加載到內(nèi)存空間中。這種方法不僅減少了exe文件的大小和對(duì)內(nèi)存空間的需求,還使這些dll模塊能夠被多個(gè)應(yīng)用程序同時(shí)使用。windows本身以dll模塊的形式實(shí)現(xiàn)了一些主要的系統(tǒng)功能。
一般來(lái)說(shuō),dll是一種磁盤文件,可以。dll,。drv。豐,。sys和許多帶有。exe作為擴(kuò)展名。它由全局?jǐn)?shù)據(jù)、服務(wù)函數(shù)和資源組成,在運(yùn)行時(shí)被系統(tǒng)加載到調(diào)用進(jìn)程的虛擬空間中,成為調(diào)用進(jìn)程的一部分。如果與其他dll沒(méi)有,文件通常被映射到進(jìn)程的虛擬空間中的同一個(gè)地址。dll模塊包含各種向外界提供服務(wù)的導(dǎo)出函數(shù)。dll可以有自己的數(shù)據(jù)段,但不能有自己的堆棧,使用與調(diào)用它的應(yīng)用程序相同的堆棧模式;一個(gè)dll在內(nèi)存中只有一個(gè)實(shí)例;dll實(shí)現(xiàn)代碼封裝;dll的編譯與具體的編程語(yǔ)言和編譯器無(wú)關(guān)。
在win32環(huán)境中,每個(gè)進(jìn)程都復(fù)制自己的讀/寫全局變量。如果要與其他進(jìn)程共享內(nèi)存,必須使用內(nèi)存映射文件或聲明一個(gè)共享數(shù)據(jù)段。dll模塊所需的堆棧內(nèi)存是從運(yùn)行進(jìn)程的堆棧中分配的。windows在加載dll模塊時(shí)將進(jìn)程函數(shù)調(diào)用與dll文件的導(dǎo)出函數(shù)相匹配。windows操作系統(tǒng)對(duì)dll的操作只是映射dll。轉(zhuǎn)到需要它的進(jìn)程的虛擬地址空間。dll函數(shù)中的代碼創(chuàng)建的任何對(duì)象(包括變量)都屬于調(diào)用它的線程或進(jìn)程。
呼叫模式
1.靜態(tài)調(diào)用編譯器系統(tǒng)在應(yīng)用程序結(jié)束時(shí)完成加載dll和卸載dll的編碼(如果有其他程序使用該dll,則該dll在windows中的應(yīng)用記錄減1,直到所有相關(guān)程序都使用完該dll后才釋放,簡(jiǎn)單實(shí)用,但不夠靈活,只能滿足一般要求。
隱式調(diào)用:您需要添加。生成應(yīng)用程序項(xiàng)目的動(dòng)態(tài)鏈接庫(kù)時(shí)生成的lib文件。當(dāng)你想使用dll中的函數(shù)時(shí),你只需要解釋它。隱式調(diào)用不需要調(diào)用loadlibrary和freelibrary。當(dāng)程序員創(chuàng)建一個(gè)dll文件時(shí),鏈接器會(huì)自動(dòng)生成一個(gè)對(duì)應(yīng)的lib導(dǎo)入文件。該文件包含每個(gè)dll導(dǎo)出函數(shù)的符號(hào)名和可選標(biāo)識(shí)號(hào),但不包含實(shí)際代碼。lib文件作為dll的替代文件被編譯到應(yīng)用程序項(xiàng)目中。
程序員通過(guò)靜態(tài)鏈接編譯生成應(yīng)用程序時(shí),應(yīng)用程序中的調(diào)用函數(shù)與lib文件中導(dǎo)出的符號(hào)相匹配,這些符號(hào)或標(biāo)識(shí)號(hào)進(jìn)入生成的exe文件。lib文件還包含相應(yīng)的dl l文件名(但不是完整的路徑名),該文件名由鏈接器存儲(chǔ)在exe文件中。
當(dāng)應(yīng)用程序需要加載dll文件時(shí),windows根據(jù)這些信息找到并加載dll,然后通過(guò)符號(hào)名或標(biāo)識(shí)號(hào)動(dòng)態(tài)鏈接dll函數(shù)。加載應(yīng)用程序exe文件時(shí),應(yīng)用程序調(diào)用的所有dll文件都將被加載到內(nèi)存中。可執(zhí)行程序鏈接到輸入庫(kù)文件(。lib文件),包含有關(guān)dll輸出函數(shù)的信息。操作系統(tǒng)在加載可執(zhí)行程序時(shí)加載dll??蓤?zhí)行程序通過(guò)函數(shù)名直接調(diào)用dll的輸出函數(shù),調(diào)用方法與程序內(nèi)部其他函數(shù)相同。
2.動(dòng)態(tài)調(diào)用程序員用api函數(shù)加載和卸載dll,達(dá)到調(diào)用dll的目的,使用起來(lái)比較復(fù)雜,但可以更有效地利用內(nèi)存,是編譯大型應(yīng)用程序的重要。
顯式調(diào)用:指用mfc提供的loadlibrary或afxloadlibrary在應(yīng)用程序中顯式調(diào)用自己制作的動(dòng)態(tài)鏈接庫(kù),動(dòng)態(tài)鏈接庫(kù)的文件名就是上述兩個(gè)函數(shù)的參數(shù),然后用getprocaddress獲取要引入的函數(shù)。從那時(shí)起,您可以調(diào)用這個(gè)傳入函數(shù),就像它是這個(gè)應(yīng)用程序的自定義函數(shù)一樣。在應(yīng)用中在程序退出之前,應(yīng)該使用mfc提供的freelibrary或者afxfreelibrary來(lái)釋放動(dòng)態(tài)鏈接庫(kù)。直接調(diào)用win32的loadlibary函數(shù),并將dll的路徑指定為參數(shù)。loadlibary返回應(yīng)用程序在調(diào)用getprocaddress函數(shù)時(shí)使用的提示參數(shù)。getprocaddress函數(shù)將符號(hào)名或標(biāo)識(shí)號(hào)轉(zhuǎn)換成dll中的地址。程序員可以決定何時(shí)加載或不加載dll文件,顯式鏈接決定在運(yùn)行時(shí)加載哪個(gè)dll文件。使用dll的程序在使用前必須加載dll以獲取某個(gè)dll模塊的句柄,然后調(diào)用getprocaddress函數(shù)獲取輸出函數(shù)的指針,退出前必須卸載dll (free loadlibrary)。
windows將按照下列搜索順序查找dll:
包含exe文件的目錄進(jìn)程的當(dāng)前工作目錄windows系統(tǒng)目錄windows目錄是mfc中path環(huán)境變量dll中列出的一系列目錄。
非mfc dll:指不使用mfc類庫(kù)結(jié)構(gòu),直接用c語(yǔ)言編寫的dll,其輸出函數(shù)一般使用標(biāo)準(zhǔn)c接口,可以被非mfc或mfc編寫的應(yīng)用程序調(diào)用。常規(guī)dll:和下面描述的擴(kuò)展dll一樣,是用mfc類庫(kù)寫的。明顯的特點(diǎn)是源文件中有一個(gè)繼承cwinapp的類。可以細(xì)分為靜態(tài)連接mfc和動(dòng)態(tài)連接mfc。靜態(tài)連接到mfc 的動(dòng)態(tài)連接庫(kù)僅受vc 的專業(yè)版和企業(yè)版。任何win32程序都可以使用這種dll應(yīng)用程序中的輸出函數(shù),包括使用mfc的應(yīng)用程序。輸入函數(shù)具有以下形式:
外部和內(nèi)部c 導(dǎo)出您的exportedfunction;
沒(méi)有外在的 c 裝飾,輸出函數(shù)只能從c代碼調(diào)用。
dll應(yīng)用程序是從cwinapp派生的,但是沒(méi)有消息循環(huán)。
動(dòng)態(tài)鏈接到mfc的常規(guī)dll應(yīng)用程序中的輸出函數(shù)可由任何win32程序使用,包括使用mfc的應(yīng)用程序。但是,dll的所有函數(shù)輸出都應(yīng)該以下面的語(yǔ)句開始:
此語(yǔ)句用于正確切換mfc模塊。狀態(tài)。
用支持dll技術(shù)的所有語(yǔ)言編寫的應(yīng)用程序都可以調(diào)用常規(guī)dll。在這個(gè)動(dòng)態(tài)鏈接庫(kù)中,它必須有一個(gè)繼承自cwinapp的類,而dllmain函數(shù)是mfc提供的,所以不需要顯式編寫。
擴(kuò)展dll:用來(lái)復(fù)用從mfc繼承的類,也就是這種類型的動(dòng)態(tài)鏈接庫(kù)可以用來(lái)輸出從mfc繼承的類。它輸出的函數(shù)只能由使用mfc并動(dòng)態(tài)鏈接到它的應(yīng)用程序使用。你可以從mfc中繼承你想要的,更適合自己使用的東西,提供給你的應(yīng)用。也可以隨意為應(yīng)用程序提供mfc或mfc繼承類對(duì)象指針。擴(kuò)展dll是通過(guò)使用mfc的動(dòng)態(tài)鏈接版本創(chuàng)建的,它僅由使用mfc類庫(kù)編寫的應(yīng)用程序調(diào)用。擴(kuò)展dll不同于常規(guī)dll,因?yàn)樗鼪](méi)有從cwinapp繼承的類對(duì)象,所以必須為dllmain函數(shù)添加初始化代碼和結(jié)束代碼。
與常規(guī)dll相比,有以下不同之處:
1.它沒(méi)有從cwinapp派生的對(duì)象;
2.它必須有一個(gè)dllmain函數(shù);
3.當(dāng)dllmin調(diào)用afxinitextensionmodule函數(shù)時(shí),需要檢查函數(shù)的返回值。如果它返回0,dllmmain也返回0;
4.如果它想要輸出cruntimeclass類型的對(duì)象或資源,它需要提供一個(gè)初始化函數(shù)來(lái)創(chuàng)建一個(gè)cdynlinklibrary對(duì)象。而且,需要輸出初始化函數(shù);
5.使用擴(kuò)展dll的mfc應(yīng)用程序必須有一個(gè)從cwinapp派生的類,一般在initinstance中調(diào)用擴(kuò)展dll的初始化函數(shù)。
dll入口函數(shù)
1.每個(gè)dll都必須有一個(gè)入口點(diǎn),dllmain是一個(gè)默認(rèn)的入口函數(shù)。dllmain負(fù)責(zé)初始化和終止。每當(dāng)一個(gè)新進(jìn)程或該進(jìn)程的一個(gè)新線程訪問(wèn)該dll時(shí),或者每個(gè)訪問(wèn)該dll的進(jìn)程或線程不再使用該dll或結(jié)束時(shí),將調(diào)用dllmain。但是,使用terminateprocess或terminatethread結(jié)束進(jìn)程或線程不會(huì)調(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)用動(dòng)態(tài)庫(kù)時(shí)指向自身的句柄(其實(shí)是指向_dgroup段的選擇器);
ul_reason_for_call:是一個(gè)標(biāo)志,解釋為什么調(diào)用動(dòng)態(tài)庫(kù)。當(dāng)進(jìn)程或線程加載或卸載動(dòng)態(tài)鏈接庫(kù)時(shí)。
標(biāo)簽:
函數(shù)調(diào)用應(yīng)用程序
了解更多dll文件的作用是什么(dll文件長(zhǎng)什么樣)相關(guān)內(nèi)容請(qǐng)關(guān)注本站點(diǎn)。
上一個(gè):無(wú)雙大蛇全過(guò)關(guān)攻略(無(wú)雙大蛇正常版攻略)
下一個(gè):u盤文件禁止復(fù)制(u盤里的文件,被限制復(fù)制粘貼怎么辦)

RBT-6000-ZLG甲醇?xì)怏w檢測(cè)報(bào)警器
杉木黃化病的癥狀及防治方法
這幾天我服務(wù)器上的網(wǎng)站打不開
Linux運(yùn)維基礎(chǔ) - Mysql
gov域名注冊(cè)條件有哪些?申請(qǐng)一個(gè)域名可以干什么?
小米呼叫轉(zhuǎn)移在哪里設(shè)置方法(小米呼叫轉(zhuǎn)移在哪里)
無(wú)固定期租房合同怎么辦
windows11固態(tài)硬盤分區(qū),固態(tài)硬盤分區(qū)教程 固態(tài)硬盤怎么正確分區(qū)
如何鑒定婚前財(cái)產(chǎn)
固態(tài)十大硬盤品牌排行榜最新,國(guó)產(chǎn)十大機(jī)械硬盤品牌排行榜
十八禁 网站在线观看免费视频_2020av天堂网_一 级 黄 色 片免费网站_绝顶高潮合集Videos