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