欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

DLL(Dynamic Linkable Library) 詳解說明

 更新時間:2008年12月26日 12:17:07   作者:  
DLL文件(Dynamic Linkable Library 即動態(tài)鏈接庫文件),是一種不能單獨(dú)運(yùn)行的文件,它允許程序共享執(zhí)行特殊任務(wù)所必需的代碼和其他資源
比較大的應(yīng)用程序都由很多模塊組成,這些模塊分別完成相對獨(dú)立的功能,它們彼此協(xié)作來完成整個軟件系統(tǒng)的工作??赡艽嬖谝恍┠K的功能較為通用,在構(gòu)造其它軟件系統(tǒng)時仍會被使用。在構(gòu)造軟件系統(tǒng)時,如果將所有模塊的源代碼都靜態(tài)編譯到整個應(yīng)用程序 EXE 文件中,會產(chǎn)生一些問題:一個缺點是增加了應(yīng)用程序的大小,它會占用更多的磁盤空間,程序運(yùn)行時也會消耗較大的內(nèi)存空間,造成系統(tǒng)資源的浪費(fèi);另一個缺點是,在編寫大的 EXE 程序時,在每次修改重建時都必須調(diào)整編譯所有源代碼,增加了編譯過程的復(fù)雜性,也不利于階段性的單元測試。

Windows 系統(tǒng)平臺上提供了一種完全不同的較有效的編程和運(yùn)行環(huán)境,你可以將獨(dú)立的程序模塊創(chuàng)建為較小的 DLL 文件,并可對它們單獨(dú)編譯和測試。在運(yùn)行時,只有當(dāng) EXE 程序確實要調(diào)用這些 DLL 模塊的情況下,系統(tǒng)才會將它們裝載到內(nèi)存空間中。這種方式不僅減少了 EXE 文件的大小和對內(nèi)存空間的需求,而且使這些 DLL 模塊可以同時被多個應(yīng)用程序使用。Windows 自己就將一些主要的系統(tǒng)功能以 DLL 模塊的形式實現(xiàn)。

一般來說,DLL 是一種磁盤文件,以.dll、.DRV、.FON、.SYS 和許多以 .EXE 為擴(kuò)展名的系統(tǒng)文件都可以是 DLL。它由全局?jǐn)?shù)據(jù)、服務(wù)函數(shù)和資源組成,在運(yùn)行時被系統(tǒng)加載到調(diào)用進(jìn)程的虛擬空間中,成為調(diào)用進(jìn)程的一部分。如果與其它 DLL 之間沒有沖突,該文件通常映射到進(jìn)程虛擬空間的同一地址上。DLL 模塊中包含各種導(dǎo)出函數(shù),用于向外界提供服務(wù)。DLL 可以有自己的數(shù)據(jù)段,但沒有自己的堆棧,使用與調(diào)用它的應(yīng)用程序相同的堆棧模式;一個 DLL 在內(nèi)存中只有一個實例;DLL 實現(xiàn)了代碼封裝性;DLL 的編制與具體的編程語言及編譯器無關(guān)。

在 Win32 環(huán)境中,每個進(jìn)程都復(fù)制了自己的讀/寫全局變量。如果想要與其它進(jìn)程共享內(nèi)存,必須使用內(nèi)存映射文件或者聲明一個共享數(shù)據(jù)段。DLL 模塊需要的堆棧內(nèi)存都是從運(yùn)行進(jìn)程的堆棧中分配出來的。Windows 在加載 DLL 模塊時將進(jìn)程函數(shù)調(diào)用與 DLL 文件的導(dǎo)出函數(shù)相匹配。Windows 操作系統(tǒng)對 DLL 的操作僅僅是把 DLL 映射到需要它的進(jìn)程的虛擬地址空間里去。DLL 函數(shù)中的代碼所創(chuàng)建的任何對象(包括變量)都?xì)w調(diào)用它的線程或進(jìn)程所有。

調(diào)用方式:
1、靜態(tài)調(diào)用方式:由編譯系統(tǒng)完成對 DLL 的加載和應(yīng)用程序結(jié)束時 DLL 卸載的編碼(如還有其它程序使用該 DLL,則 Windows 對 DLL 的應(yīng)用記錄減1,直到所有相關(guān)程序都結(jié)束對該 DLL 的使用時才釋放它,簡單實用,但不夠靈活,只能滿足一般要求。
隱式的調(diào)用:需要把產(chǎn)生動態(tài)連接庫時產(chǎn)生的 .LIB 文件加入到應(yīng)用程序的工程中,想使用 DLL 中的函數(shù)時,只須說明一下。隱式調(diào)用不需要調(diào)用 LoadLibrary() 和 FreeLibrary()。程序員在建立一個 DLL 文件時,鏈接程序會自動生成一個與之對應(yīng)的 LIB 導(dǎo)入文件。該文件包含了每一個 DLL 導(dǎo)出函數(shù)的符號名和可選的標(biāo)識號,但是并不含有實際的代碼。LIB 文件作為 DLL 的替代文件被編譯到應(yīng)用程序項目中。
當(dāng)程序員通過靜態(tài)鏈接方式編譯生成應(yīng)用程序時,應(yīng)用程序中的調(diào)用函數(shù)與 LIB 文件中導(dǎo)出符號相匹配,這些符號或標(biāo)識號進(jìn)入到生成的 EXE 文件中。LIB 文件中也包含了對應(yīng)的 DL L文件名(但不是完全的路徑名),鏈接程序?qū)⑵浯鎯υ?EXE 文件內(nèi)部。
當(dāng)應(yīng)用程序運(yùn)行過程中需要加載 DLL 文件時,Windows 根據(jù)這些信息發(fā)現(xiàn)并加載 DLL,然后通過符號名或標(biāo)識號實現(xiàn)對 DLL 函數(shù)的動態(tài)鏈接。所有被應(yīng)用程序調(diào)用的 DLL 文件都會在應(yīng)用程序 EXE 文件加載時被加載在到內(nèi)存中??蓤?zhí)行程序鏈接到一個包含 DLL 輸出函數(shù)信息的輸入庫文件(.LIB文件)。操作系統(tǒng)在加載使用可執(zhí)行程序時加載 DLL。可執(zhí)行程序直接通過函數(shù)名調(diào)用 DLL 的輸出函數(shù),調(diào)用方法和程序內(nèi)部其 它的函數(shù)是一樣的。

2、動態(tài)調(diào)用方式:是由編程者用 API 函數(shù)加載和卸載 DLL 來達(dá)到調(diào)用 DLL 的目的,使用上較復(fù)雜,但能更加有效地使用內(nèi)存,是編制大型應(yīng)用程序時的重要方式。

顯式的調(diào)用:
是指在應(yīng)用程序中用 LoadLibrary 或 MFC 提供的 AfxLoadLibrary 顯式的將自己所做的動態(tài)連接庫調(diào)進(jìn)來,動態(tài)連接庫的文件名即是上面兩個函數(shù)的參數(shù),再用 GetProcAddress() 獲取想要引入的函數(shù)。自此,你就可以象使用如同本應(yīng)用程序自定義的函數(shù)一樣來調(diào)用此引入函數(shù)了。在應(yīng)用程序退出之前,應(yīng)該用 FreeLibrary 或 MFC 提供的 AfxFreeLibrary 釋放動態(tài)連接庫。直接調(diào)用 Win32 的 LoadLibary 函數(shù),并指定 DLL 的路徑作為參數(shù)。LoadLibary 返回 HINSTANCE 參數(shù),應(yīng)用程序在調(diào)用 GetProcAddress 函數(shù)時使用這一參數(shù)。GetProcAddress 函數(shù)將符號名或標(biāo)識號轉(zhuǎn)換為 DLL 內(nèi)部的地址。程序員可以決定 DLL 文件何時加載或不加載,顯式鏈接在運(yùn)行時決定加載哪個 DLL 文件。使用 DLL 的程序在使用之前必須加載(LoadLibrary)加載DLL從而得到一個DLL模塊的句柄,然后調(diào)用 GetProcAddress 函數(shù)得到輸出函數(shù)的指針,在退出之前必須卸載DLL(FreeLibrary)。

正因為DLL 有占用內(nèi)存小,好編輯等的特點有很多電腦病毒都是DLL格式文件。但不能單獨(dú)運(yùn)行。

動態(tài)鏈接庫通常都不能直接運(yùn)行,也不能接收消息。它們是一些獨(dú)立的文件,其中包含能被可執(zhí)行程序或其它DLL調(diào)用來完成某項工作的函數(shù)。只有在其它模塊調(diào)用動態(tài)鏈接庫中的函數(shù)時,它才發(fā)揮作用。

相關(guān)文章

  • 詳解windows 環(huán)境下搭建electricSearch+kibana

    詳解windows 環(huán)境下搭建electricSearch+kibana

    這篇文章主要介紹了windows 環(huán)境下搭建electricSearch+kibana,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • 匯編語言無效指令錯誤概述

    匯編語言無效指令錯誤概述

    此錯誤僅適用于奔騰 處理器、奔騰處理器與MMX技術(shù)、奔騰OverDrive處理器 和奔騰OverDrive處理器帶有MMX技術(shù)。 奔騰Pro處理器, 奔騰II處理器和i486及更早版本處理器不受影響
    2012-07-07
  • git merge --ff/--no-ff/--ff-only 三種選項參數(shù)的區(qū)別解析

    git merge --ff/--no-ff/--ff-only 三種選項參數(shù)的區(qū)別解析

    這篇文章主要介紹了git merge --ff/--no-ff/--ff-only 三種選項參數(shù)的區(qū)別解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • Hbuilder配置Avalon和Vue指令提示的方法詳解

    Hbuilder配置Avalon和Vue指令提示的方法詳解

    HBuilder是DCloud(數(shù)字天堂)推出的一款支持HTML5的Web開發(fā)IDE,下面這篇文章主要給大家介紹了關(guān)于Hbuilder如何配置Avalon和Vue指令提示的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-10-10
  • 如何理解軟件系統(tǒng)的高并發(fā)

    如何理解軟件系統(tǒng)的高并發(fā)

    本文介紹高并發(fā)系統(tǒng)的度量指標(biāo),講述高并發(fā)系統(tǒng)的設(shè)計思路,再梳理高并發(fā)的關(guān)鍵技術(shù),最后結(jié)合作者的經(jīng)驗做一些延伸探討。
    2021-05-05
  • 匯編優(yōu)化提示

    匯編優(yōu)化提示

    暑假瞄了一些匯編優(yōu)化的文章,感覺這篇有點意思。盡管英文水平不咋地,還是倔起牛勁翻譯了下??隙ㄓ胁缓玫牡胤剑蠹液:瓇英文原文附件給出~如果有什么錯誤還望批評指正~另外,如果admin感覺可以加精的話就麻煩下了
    2012-07-07
  • java與c#的區(qū)別、兩者有什么不同?

    java與c#的區(qū)別、兩者有什么不同?

    Java和C#都是一門面向?qū)ο蟮恼Z言,Java更多地借鑒了C++的優(yōu)點,而摒棄了它的一些不太容易被人掌握的知識點(有些不能說是缺點),并且增加了一些自己的特點,而C#則是更多地借鑒了Java的優(yōu)點,而增加了一些自己的特點
    2013-04-04
  • 人人都是開發(fā)者:7款傻瓜式APP開發(fā)工具

    人人都是開發(fā)者:7款傻瓜式APP開發(fā)工具

    國外的營銷工作者和技術(shù)開發(fā)者開發(fā)了許多能幫助企業(yè)創(chuàng)建簡單APP應(yīng)用的工具,通過這些工具,就算是一個對程序一竅不通的普通網(wǎng)民都可以很容易的創(chuàng)建一個企業(yè)的APP程序,并可以對程序進(jìn)行應(yīng)用更新維護(hù),開展?fàn)I銷等活動
    2013-11-11
  • 詳解提升場景文本識別中的語言模型

    詳解提升場景文本識別中的語言模型

    語言模型即根據(jù)當(dāng)前語境的上下文推斷當(dāng)前句子的意思。文本圖像中包含兩層信息:視覺紋理信息和語言信息。由于單純根據(jù)視覺紋理信息進(jìn)行文字識別缺少了對上下文的字符語義信息的挖掘,時常會導(dǎo)致錯誤的文本識別結(jié)果(之后會詳細(xì)說明)。
    2021-05-05
  • 微信支付jsapi缺少參數(shù) total_fee 錯誤分析與解決方法

    微信支付jsapi缺少參數(shù) total_fee 錯誤分析與解決方法

    這篇文章主要介紹了微信支付jsapi缺少參數(shù) total_fee 錯誤分析與解決方法,需要的朋友可以參考下
    2018-03-03

最新評論