青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

關于的dll學習總結!

Posted on 2007-12-15 17:03 T.S Liu 閱讀(363) 評論(0)  編輯 收藏 引用

動態鏈接庫,即dll -- dynamic linkable library

        一般來說,dll是一種文件,其擴展名為.dll。它是由全局數據,服務函數和資源組成;在運行的時候被加載到進程的虛擬空間中。dll中包含了各種導出函數,用于向外界提供服務,dll可以有自己的數據段,但是沒有自己的堆棧,它的吏用與調用它的程式有相同的堆棧模式。在win32環境中,每一個進程都復制自己的讀寫全局變量,如果要想與其它進程共享內存,必須在聲明一個共享數據段!

        dll也是一種可執行文件,只不過它不能像exe文件那樣直接執行,而是做為其它可執行文件的共享函數庫!使用dll的應用程序可以調用dll中導出函數(imported function),不過應用程序并不包含這些函數的可執行代碼,而是它們經過編譯后獨立的保存在dll中!這和以前的靜態鏈接不同,使用靜態鏈接庫(static link library)的應用程序從庫中得到所引用的函數的可執行代碼,然后放在自身的可執行文件中,這就可使其size變大,應用程序運行不在需要靜態函數庫的支持!
        而使用dll的應用程序只包含用于dll中定位所引用的函數信息,沒有函數的實現,其size相對靜態要小的多,但是其運行要從dll中獲得函數的實現代碼,要dll的支持!


        dll的優點:
        1. dll提供一種共享數據和代碼的途徑,由于多個應用程序共享同一個dll中的函數,可以縮小應用程式的可執行文件的大小,使的dll可以顯著的節省磁盤空間。
        2. dll是獨立于可執行文件的,如果要向dll中增加新的函數和功能,只要原有函數的參數和返回值不變,所有使用這個dll的應用程序升級后都不要重新編譯。
        3. 標準的dll可以被其它語言來使用! 

        dll有多種類型,非 MFC dll,靜態鏈接到MFC的常規dll,動態鏈接到MFC的常規dll. MFC 擴展dll。dll文件包括一個導出表,導出表中給出可從dll中導出函數的名字,dll中定義了兩種函數,導出函數(export function)和內部函數(internal function),其中導出函數可以被其它的模塊調用,而內部函數只能在內部使用。dll結構可以用VC++工具dumpbin和depends查看!

        編寫dll的主要步驟
        我們在用C++定制dll文件時,要編寫包含導出函數的模塊定義文件.def和實現導出函數功能的C++文件。
        1. 模塊定義文件(.def)是由一個或者多個用于描述dll屬性的語句塊組成的文本文件,每個.def文件必須包含以下模塊定義語句。
        第一個語句必須是LIBRARY語句,其指出dll的名字。
        第二個EXPORTS語句列出被導出函數的名字,";"對一行進行注釋!
         LIBRARY mydll
         EXPORTS
         ulDataInDll   DATA

         myfunction @number
         其中@number指出導出函數的順序值。
        2. 實現文件,在入口表函數的.cpp文件中,包含dll入口點處理的API函數和導出函數的代碼。入口函數LibMain()就像C中的main(),windows每次加載dll時都要執行此函數。

dll中函數導出的方法有兩種,1. 在創建dll時使用.DEF文件。2. 在定義函數時使用關鍵字_declspec(dllexport)。僅僅知道導出數的名稱并不足以從dll中導出函數。若在應用程序中使用顯式鏈接,至少還要知道導出函數的返回值及參數。若用隱函鏈接,必須括有導出函數的定義頭文件(.h) 和  引入庫文件(import library, .LIB文件)。

        如。1使用DEF文件導出DLL中的函數。
        prog.DEF文件定義一個函數。

        LIBRARY mydll
        EXPORTS

        ShowMsgBox      @1

        頭文件showmsgbox.h
        #include <windows>
        extern "C"
        {
             int ShowMsgBox(LPCTSTR lpText = 'example', LPCTSTR lpCaption = 'EXAMPLE');
        }

        實現文件showmsgbox.cpp
        #include "showmsgbox.h"
        int ShowMsgBox(LPCTSTR lpText = 'example', LPCTSTR lpCaption = 'EXAMPLE')
        {
             return MessageBox(NULL, lpText, lpCaption);
        }
        然后編譯后生成showmsgbox.lib, showmsgbox.dll.

        2. 使用_declspec(dllexport)導出dll中的函數,此時不用DEF文件。
        頭文件showmsgbox.h
        #include <windows>
        extern "C"
        {
             _declspec(dllexport) int ShowMsgBox(LPCTSTR lpText = 'example', LPCTSTR lpCaption = 'EXAMPLE');
        }
        .cpp文件還是上面那個,然后編譯后生成showmsgbox.lib, showmsgbox.dll.

       dll加載與調用
       dll加載順序,1. 系統dll,如kennel32.dll, user32.dll  2. 工作盤當前目錄 3. windows系統目錄,用GetsystemDirectory()可以獲得。4. windows所在目錄。

        dll有兩種調用方法,靜態調用,動態調用。靜態調用是編譯系統完成加載dll和應用程序結束時卸載dll,這種方法簡單但不靈活。動態調用方式使用API加載卸載dll。
        隱含鏈接,顯式鏈接
        隱含鏈接要dll文件外還要一個包含導出函數或C++類頭文件和相應的LIB
        showmsgbox.dll對應的頭文件showmsgbox.h
        #include <windows.h>
        extern "C"
        {
             _declspec(dllimport) int ShowMsgBox(LPCTSTR lpText = 'example', LPCTSTR lpCaption = 'EXAMPLE');
        }
        使不使用_declspec(dllimport)都可以,但是使用它會產生更高效的代碼。
        dlltest.cpp
        #include "showmsgbox.h"
        int _stdcall winmain(......)
       {
             return ShowMsgBox();
       }
 然后把showmsgbox.dll文件放到工程的debug\下,同時把showmsgbox.LIB放到鏈接器的命令行中。就OK了!!
         
        顯式鏈接
        用API加載dll,LoadLibrary() --> GetProcAddress() --> FreeLibrary().
        dlltest.cpp
        #include <windows>
        typedef (callback *DLLFUNC)(LPCTSTR lpText = 'example', LPCTSTR lpCaption = 'EXAMPLE');
        int _stdcall winmain(......)
       {
             HINSTANCE hDll; //DLL句柄
                DLLFUNC  ShowMsgBox; //函數指針
                hDll = LoadLibrary("mydll');
             if (hDLL != NULL)
             {
                  ShowMsgBox = (DLLFUNC)GetProcAddress(hDll, "mydll");
             }
                FreeLibrary(hDLL);
      }
      OK!
       
1、靜態調用方式:由編譯系統完成對DLL的加載和應用程序結束時DLL卸載的編碼(如還有其它程序使用該DLL,則Windows對DLL的應用記錄減1,直到所有相關程序都結束對該DLL的使用時才釋放它),簡單實用,但不夠靈活,只能滿足一般要求。  
   
    隱式的調用:需要把產生動態連接庫時產生的.LIB文件加入到應用程序的工程中,想使用DLL中的函數時,只須說明一下。隱式調用不需要調用LoadLibrary()和FreeLibrary()。程序員在建立一個DLL文件時,鏈接程序會自動生成一個與之對應的LIB導入文件。該文件包含了每一個DLL導出函數的符號名和可選的標識號,但是并不含有實際的代碼。LIB文件作為DLL的替代文件被編譯到應用程序項目中。當程序員通過靜態鏈接方式編譯生成應用程序時,應用程序中的調用函數與LIB文件中導出符號相匹配,這些符號或標識號進入到生成的EXE文件中。LIB文件中也包含了對應的DLL文件名(但不是完全的路徑名),鏈接程序將其存儲在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環境變量中的一系列目錄。

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            中文一区二区| 在线精品一区| 亚洲午夜精品视频| 亚洲美女毛片| 欧美精品v国产精品v日韩精品| 亚洲精品少妇| 亚洲视频www| 国产区在线观看成人精品| 亚洲欧美日本日韩| 亚洲欧美日韩一区二区在线| 国产在线一区二区三区四区| 免费看av成人| 欧美日韩在线播放三区四区| 亚洲一区欧美二区| 欧美在线观看视频在线| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美激情视频在线播放| 欧美久久在线| 欧美一区影院| 欧美+日本+国产+在线a∨观看| 一区二区三区视频在线看| 亚洲女人天堂av| 亚洲国产精品成人va在线观看| 亚洲精品在线视频观看| 国产欧美欧洲在线观看| 欧美国产精品一区| 国产伦精品一区二区三区| 免费亚洲电影在线| 国产精品地址| 欧美国产日韩免费| 国产精品一区二区三区成人| 免费人成网站在线观看欧美高清| 欧美日韩免费一区二区三区| 麻豆精品精品国产自在97香蕉| 欧美啪啪成人vr| 久久久久国产精品www| 欧美日韩国语| 噜噜爱69成人精品| 国产麻豆精品在线观看| 亚洲国产mv| 国产一区91精品张津瑜| 日韩视频在线一区二区| 亚洲级视频在线观看免费1级| 亚洲免费在线电影| 中文日韩在线视频| 欧美电影免费观看网站| 久久美女艺术照精彩视频福利播放| 欧美视频精品在线| 欧美激情在线狂野欧美精品| 国产一区二区三区四区五区美女| 99视频精品| 宅男噜噜噜66国产日韩在线观看| 久久久在线视频| 久久久久久久国产| 国产欧美一区二区精品秋霞影院| 日韩亚洲成人av在线| 亚洲精品在线视频| 欧美成人有码| 亚洲成色777777女色窝| 亚洲高清视频在线| 久久性天堂网| 麻豆成人在线播放| 一区二区三区在线视频免费观看| 性欧美长视频| 久久人人爽人人| 狠狠操狠狠色综合网| 亚洲欧美日韩在线高清直播| 先锋a资源在线看亚洲| 国产精品乱人伦中文| 一区二区国产在线观看| 亚洲一区二区在线播放| 欧美性猛交xxxx乱大交退制版| 日韩午夜免费视频| 亚洲女女女同性video| 欧美视频福利| 亚洲影院色在线观看免费| 欧美一级日韩一级| 国内精品久久久久影院色| 欧美中文在线免费| 欧美成人a视频| 日韩亚洲国产欧美| 欧美三级网页| 欧美一区二区三区喷汁尤物| 久久黄色小说| 91久久线看在观草草青青| 欧美激情片在线观看| 亚洲伦理网站| 欧美一区二区黄色| 尤物精品在线| 欧美人妖另类| 性欧美18~19sex高清播放| 久久免费精品视频| 亚洲人精品午夜| 国产精品日韩久久久| 久久久久99| 亚洲伦伦在线| 久久久久久久综合色一本| 亚洲高清不卡av| 国产精品久久久久久久久免费樱桃| 亚洲欧美日韩精品久久奇米色影视 | 亚洲靠逼com| 国产精品国产馆在线真实露脸| 欧美一区二区三区另类| 欧美搞黄网站| 午夜精品偷拍| 亚洲电影免费观看高清| 欧美亚洲成人精品| 另类图片综合电影| 亚洲天堂偷拍| 亚洲电影在线| 久久久爽爽爽美女图片| 日韩视频在线观看免费| 国产主播一区| 欧美三级日韩三级国产三级| 久久久人成影片一区二区三区观看| 亚洲精品在线二区| 欧美成人激情视频免费观看| 亚洲欧美日韩精品久久亚洲区 | 狠狠色狠狠色综合人人| 欧美日韩精品免费| 猛男gaygay欧美视频| 午夜久久久久久| 99视频热这里只有精品免费| 亚洲成在线观看| 久久尤物电影视频在线观看| 亚洲欧美国产制服动漫| 洋洋av久久久久久久一区| 精品99一区二区三区| 国产精品亚洲综合久久| 欧美片网站免费| 欧美国产视频一区二区| 麻豆免费精品视频| 久久久久久久波多野高潮日日| 亚洲一区二区影院| 在线一区二区视频| 在线视频欧美日韩| 夜夜嗨av一区二区三区四区| 亚洲国产精品一区二区尤物区| 免费观看一级特黄欧美大片| 久久精品国产一区二区电影| 欧美一区91| 欧美一区二区在线观看| 午夜国产不卡在线观看视频| 亚洲天堂激情| 亚洲综合色自拍一区| 在线综合亚洲欧美在线视频| 99精品久久久| 一区二区欧美亚洲| 亚洲最新合集| 亚洲午夜一二三区视频| 亚洲午夜久久久| 亚洲欧美激情在线视频| 亚洲免费视频成人| 香蕉久久夜色精品| 久久精品女人的天堂av| 久久一区视频| 欧美肥婆在线| 亚洲激情第一区| 日韩午夜在线电影| 亚洲视频碰碰| 久久国产精品网站| 久久综合九色综合欧美就去吻| 久久偷看各类wc女厕嘘嘘偷窃| 能在线观看的日韩av| 欧美剧在线观看| 国产精品伦理| 伊人久久男人天堂| 日韩午夜激情| 欧美在线影院在线视频| 久久人人97超碰人人澡爱香蕉| 欧美成人精品三级在线观看| 91久久精品www人人做人人爽| 亚洲日本在线观看| 午夜亚洲性色视频| 免费亚洲一区二区| 欧美性开放视频| 精品成人久久| 亚洲午夜久久久久久久久电影网| 欧美一级片久久久久久久| 免费试看一区| 亚洲素人一区二区| 美女主播精品视频一二三四| 欧美日韩一区二区欧美激情 | 国产精品成人国产乱一区| 国产一区二区三区视频在线观看 | 国产精品福利久久久| 尤物精品国产第一福利三区 | 在线日韩一区二区| 亚洲无人区一区| 欧美a一区二区| 亚洲一区二区成人| 女人色偷偷aa久久天堂| 国产欧美二区| 一区二区三区高清在线观看| 老司机久久99久久精品播放免费| 夜久久久久久| 欧美成人一二三| 激情视频一区二区三区| 亚洲欧美另类中文字幕| 亚洲电影自拍|