一区二区三区在线视频播放_一区在线播放视频_欧美.com_亚洲精品无人区_久久亚洲精品视频_国产精品久久久久久久免费软件_久久av一区二区三区_欧美国产日韩精品免费观看_亚洲一区自拍_91久久国产精品91久久性色_亚洲一区二区三区在线播放_久久久久久久一区_国产精品一区二区久久久_精品成人国产_亚洲欧洲精品一区二区三区波多野1战4_在线观看亚洲精品

綠色資源網:您身邊最放心的安全下載站! 最新軟件|熱門排行|軟件分類|軟件專題|廠商大全

綠色資源網

技術教程
您的位置:首頁操作系統windows → dll文件介紹

dll文件介紹

我要評論 2011/01/14 19:32:44 來源:綠色資源網 編輯:綠色資源站 [ ] 評論:0 點擊:230次

比較大的應用程序都由很多模塊組成,這些模塊分別完成相對獨立的功能,它們彼此協作來完成整個軟件系統的工作??赡艽嬖谝恍┠K的功能較為通用,在構造其它軟件系統時仍會被使用。在構造軟件系統時,如果將所有模塊的源代碼都靜態編譯到整個應用程序 EXE 文件中,會產生一些問題:一個缺點是增加了應用程序的大小,它會占用更多的磁盤空間,程序運行時也會消耗較大的內存空間,造成系統資源的浪費;另一個缺點是,在編寫大的 EXE 程序時,在每次修改重建時都必須調整編譯所有源代碼,增加了編譯過程的復雜性,也不利于階段性的單元測試。

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

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

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

調用方式

1、靜態調用方式:由編譯系統完成對 DLL 的加載和應用程序結束時 DLL 卸載的編碼(如還有其它程序使用該 DLL,則 Windows 對 DLL 的應用記錄減1,直到所有相關程序都結束對該 DLL 的使用時才釋放它,簡單實用,但不夠靈活,只能滿足一般要求。

隱式的調用:需要把產生動態連接庫時產生的 .LIB 文件加入到應用程序的工程中,想使用 DLL 中的函數時,只須說明一下。隱式調用不需要調用 LoadLibrary() 和 FreeLibrary()。程序員在建立一個 DLL 文件時,鏈接程序會自動生成一個與之對應的 LIB 導入文件。該文件包含了每一個 DLL 導出函數的符號名和可選的標識號,但是并不含有實際的代碼。LIB 文件作為 DLL 的替代文件被編譯到應用程序項目中。

當程序員通過靜態鏈接方式編譯生成應用程序時,應用程序中的調用函數與 LIB 文件中導出符號相匹配,這些符號或標識號進入到生成的 EXE 文件中。LIB 文件中也包含了對應的 DL L文件名(但不是完全的路徑名),鏈接程序將其存儲在 EXE 文件內部。

當應用程序運行過程中需要加載 DLL 文件時,Windows 根據這些信息發現并加載 DLL,然后通過符號名或標識號實現對 DLL 函數的動態鏈接。所有被應用程序調用的 DLL 文件都會在應用程序 EXE 文件加載時被加載在到內存中??蓤绦谐绦蜴溄拥揭粋€包含 DLL 輸出函數信息的輸入庫文件(.LIB文件)。操作系統在加載使用可執行程序時加載 DLL??蓤绦谐绦蛑苯油ㄟ^函數名調用 DLL 的輸出函數,調用方法和程序內部其 它的函數是一樣的。

2、動態調用方式:是由編程者用 API 函數加載和卸載 DLL 來達到調用 DLL 的目的,使用上較復雜,但能更加有效地使用內存,是編制大型應用程序時的重要方式。

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

Windows將遵循下面的搜索順序來定位 DLL:

  1. 包含EXE文件的目錄
  2. 進程的當前工作目錄
  3. Windows系統目錄
  4. Windows目錄
  5. 列在 Path 環境變量中的一系列目錄

MFC中的DLL

  • Non-MFC DLL:指的是不用 MFC 的類庫結構,直接用 C 語言寫的 DLL,其輸出的函數一般用的是標準 C 接口,并能被 非 MFC 或 MFC 編寫的應用程序所調用。
  • Regular DLL:和下述的 Extension DLLs 一樣,是用 MFC 類庫編寫的。明顯的特點是在源文件里有一個繼承 CWinApp 的類。其又可細分成靜態連接到 MFC 和動態連接到 MFC 上的。

    靜態連接到 MFC 的動態連接庫只被 VC 的專業 版和企業版所支持。該類 DLL 應用程序里頭的輸出函數可以被任意 Win32 程序使用,包括使用 MFC 的應用程序。輸入函數有如下形式:

    extern "C" EXPORT YourExportedFunction();

    如果沒有 extern "C" 修飾,輸出函數僅僅能從 C++ 代碼中調用。

    DLL 應用程序從 CWinApp 派生,但沒有消息循環。

    動態鏈接到 MFC 的 規則 DLL 應用程序里頭的輸出函數可以被任意 Win32 程序使用,包括使用 MFC 的應用程序。但是,所有從 DLL 輸出的函數應該以如下語句開始:

    AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

    此語句用來正確地切換 MFC 模塊狀態。

    Regular DLL能夠被所有支持 DLL 技術的語言所編寫的應用程序所調用。在這種動態連接庫中,它必須有一個從 CWinApp 繼承下來的類,DLLMain 函數被 MFC 所提供,不用自己顯式的寫出來。

  • Extension DLL:用來實現從 MFC 所繼承下來的類的重新利用,也就是說,用這種類型的動態連接庫,可以用來輸出一個從 MFC 所繼承下來的類。它輸出的函數僅可以被使用 MFC 且動態鏈接到 MFC 的應用程序使用??梢詮?MFC 繼承你所想要的、更適于你自己用的類,并把它提供給你的應用程序。你也可隨意的給你的應用程序提供 MFC 或 MFC 繼承類的對象指針。Extension DLL使用 MFC 的動態連接版本所創建的,并且它只被用 MFC 類庫所編寫的應用程序所調用。Extension DLLs 和 Regular DLLs 不一樣,它沒有從 CWinApp 繼承而來的類的對象,所以,你必須為自己 DLLMain 函數添加初始化代碼和結束代碼。

    和規則 DLL 相比,有以下不同:

    1、它沒有從 CWinApp 派生的對象;

    2、它必須有一個 DLLMain 函數;

    3、DLLMain 調用 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(HANDLE hModule,DWORD ul_reason_for_call,LPVOID
    lpReserved)
    {
      switch(ul_reason_for_call)
      {
      case DLL_PROCESS_ATTACH:
      .......
      case DLL_THREAD_ATTACH:
      .......
      case DLL_THREAD_DETACH:
      .......
      case DLL_PROCESS_DETACH:
      .......
      return TRUE;
      }
    }

    參數:

    hMoudle:是動態庫被調用時所傳遞來的一個指向自己的句柄(實際上,它是指向_DGROUP段的一個選擇符);

    ul_reason_for_call:是一個說明動態庫被調原因的標志。當進程或線程裝入或卸載動態連接庫的時

關鍵詞:dll,dll文件

閱讀本文后您有什么感想? 已有 人給出評價!

  • 0 歡迎喜歡
  • 0 白癡
  • 0 拜托
  • 0 哇
  • 0 加油
  • 0 鄙視
一区二区三区在线视频播放_一区在线播放视频_欧美.com_亚洲精品无人区_久久亚洲精品视频_国产精品久久久久久久免费软件_久久av一区二区三区_欧美国产日韩精品免费观看_亚洲一区自拍_91久久国产精品91久久性色_亚洲一区二区三区在线播放_久久久久久久一区_国产精品一区二区久久久_精品成人国产_亚洲欧洲精品一区二区三区波多野1战4_在线观看亚洲精品
久热成人在线视频| 亚洲私人影院| 国产日韩欧美高清免费| 99精品视频网| 久久性色av| 久久精品日产第一区二区| 欧美性事免费在线观看| 亚洲线精品一区二区三区八戒| 一本色道婷婷久久欧美| 午夜在线视频一区二区区别| 在线视频日韩精品| 国产亚洲欧美日韩一区二区| 亚洲人成小说网站色在线| 欧美日韩国产精品| 国产精品一区免费视频| 99re在线精品| 欧美好骚综合网| 亚洲乱码精品一二三四区日韩在线| 久久精品国产99国产精品| 在线欧美亚洲| 欧美日韩八区| 欧美午夜精品久久久久免费视| 欧美视频网址| 中国日韩欧美久久久久久久久| 欧美日韩日日夜夜| 亚洲永久字幕| 亚洲欧美日韩专区| 久久综合九色99| 最近中文字幕mv在线一区二区三区四区| 久久亚洲春色中文字幕| 国产乱理伦片在线观看夜一区| 欧美大片在线观看| 亚洲精品日韩激情在线电影| 欧美日韩中国免费专区在线看| 亚洲精品国偷自产在线99热| 亚洲一区二区影院| 国产精品久久久久免费a∨大胸| 久久这里只精品最新地址| 国产精品草草| 一区二区三区中文在线观看| 久久久水蜜桃av免费网站| 欧美高清视频在线| 在线日韩精品视频| 欧美日韩在线大尺度| 久久精品国产综合| 久久亚洲国产精品日日av夜夜| 91久久国产综合久久蜜月精品| 欧美小视频在线观看| 国产精品久久久99| 一区二区三区成人精品| 欧美国产1区2区| 亚洲精品国产精品乱码不99| 亚洲激情国产| 欧美人交a欧美精品| 91久久精品国产91久久性色| 欧美电影资源| 国产欧美韩日| 午夜精品久久久久久99热软件| 国产欧美日韩一区二区三区在线| 欧美日韩中文字幕| 亚洲性av在线| 亚洲在线免费观看| 国产精品成人va在线观看| 欧美精品久久久久久| 久久精品视频在线观看| 欧美大尺度在线观看| 亚洲欧美综合另类中字| 欧美日产一区二区三区在线观看| 国产精品大片免费观看| 久久高清免费观看| 国产一区三区三区| 亚洲综合色婷婷| 国产精品青草久久久久福利99| 亚洲二区视频在线| 久久国产欧美| 欧美成年人网| 亚洲欧美一区二区原创| 亚洲欧美日韩国产综合精品二区| 国产网站欧美日韩免费精品在线观看| 亚洲黄色三级| 亚洲午夜成aⅴ人片| 亚洲欧美春色| 国产女主播一区二区| 国产精品九色蝌蚪自拍| 欧美日韩一区二区三区高清| 欧美aⅴ99久久黑人专区| 亚洲欧美在线aaa| 国模精品一区二区三区| 激情婷婷亚洲| 在线视频欧美日韩精品| 欧美在线观看日本一区| 国产日韩一区二区三区在线播放| 久久天天躁狠狠躁夜夜爽蜜月| 日韩午夜av| 欧美日韩黄色一区二区| 欧美一级大片在线观看| 在线观看av一区| 在线视频国产日韩| 欧美成人四级电影| 中文在线资源观看网站视频免费不卡| 一区二区三区免费网站| 欧美精品免费观看二区| 国产精品国产三级国产专播品爱网| 欧美日韩黄色大片| 欧美区高清在线| 国产欧美91| 国产一区二区三区无遮挡| 欧美另类高清视频在线| 亚洲午夜精品在线| 在线看片日韩| 久久久精品一区二区三区| 亚洲精品女av网站| 一区二区三区在线免费观看| 亚洲人成网站影音先锋播放| 欧美午夜无遮挡| 欧美日韩国产不卡在线看| 亚洲欧洲另类| 午夜免费日韩视频| 狠狠色狠狠色综合系列| 日韩一二在线观看| 欧美日韩中国免费专区在线看| 欧美日韩视频一区二区| 亚洲国产免费| 国产午夜亚洲精品不卡| 久久久蜜桃一区二区人| 久久精品国产欧美亚洲人人爽| 亚洲精品一区在线| 久久精品夜夜夜夜久久| 午夜精品福利在线观看| 免费人成网站在线观看欧美高清| 亚洲一区二区三区在线观看视频| 欧美激情一区二区三区不卡| 久久久久久久久久码影片| 夜夜嗨av一区二区三区中文字幕| 欧美99久久| 亚洲国产日本| 亚洲第一精品久久忘忧草社区| 国产日韩1区| 亚洲人成亚洲人成在线观看图片| 国产视频在线观看一区二区| 国产欧美一区在线| 夜夜嗨一区二区三区| 久久精品在线免费观看| 久久久久久久成人| 亚洲直播在线一区| 国产婷婷色综合av蜜臀av| 亚洲国产三级在线| 欧美日韩一区二区三区免费| 亚洲国语精品自产拍在线观看| 亚洲高清不卡在线观看| 国产自产女人91一区在线观看| 国产亚洲欧洲一区高清在线观看| 国产精品亚洲аv天堂网| 国产精品五月天| 亚洲免费av片| 国产精品劲爆视频| 久久精品亚洲一区二区| 亚洲欧洲在线播放| 午夜视频在线观看一区二区| 国产一区二区三区久久| 一区二区亚洲| 午夜精品电影| 91久久久国产精品| 国产伦精品一区二区三区在线观看|