<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 64,  comments - 9,  trackbacks - 0

    一、關于DLL的介紹
     
        DLL,動態鏈接庫,Dynamic Link Library的縮寫,是一個包含函數和數據的模塊集合,可以被其它應用程序共享的程序模塊。DLL作為共享函數庫的可執行文件,封裝了一個或多個已被編譯、鏈接的函數。多個進程可以同時使用一個 DLL,在內存中共享該 DLL 的一個副本。DLL 還有助于共享數據和資源。   它和可執行文件(.EXE文件)非常類似,他們的區別在于 DLL 中雖然包含了可執行代碼卻不能單獨執行,只能由需要使用它的應用程序來直接或間接調。[1]

        通俗的說,在Windows操作系統中,許多應用程序并不是一個完整的可執行文件,它們的正確執行需要調用一些相對獨立的動態鏈接庫,即DLL文件。一個應用程序可以調用多個DLL文件,一個DLL文件也可能被幾個應用程序所共用,這樣的DLL文件被稱為共享 DLL 文件。[2]DLL 文件一般被存在C:\Windows\System 目錄下,也可能放在應用程序所在的目錄或是子目錄中。

       提到動態鏈接,先說明一下靜態連接。什么是靜態連接呢?在程序鏈接的過程中,需要將編譯后的二進制代碼鏈接成目標代碼,鏈接器從靜態鏈接庫中獲得所有被引用的函數,并將這些被引用的函數同代碼一起放到可執行文件中。那么關于 DLL 的靜態連接則是指鏈接器將被引用的庫函數的代碼復制到調用 DLL 的可執行模塊(.dll 文件或 .exe 文件)中。

      什么是動態鏈接呢?動態鏈接是系統允許可執行模塊(.dll 文件或 .exe 文件)在運行程中,只需要包含在定位 DLL 函數的可執行代碼所需的信息。換句話說,可執行模塊(.dll 文件或 .exe 文件)在運行時加載這些模塊(亦即所需的模塊映射到調用進程的地址空間)。[3]

       那么動態鏈接和靜態連接 相比,優點有哪些呢?

        (1)節省內存,減少交換操作。使用動態鏈接,多個進程可以同時使用一個 DLL,在內存中共享該 DLL 的一個副本。使用靜態鏈接,每個應用程序都包含被引用的庫函數的代碼,那么Windows 必須在內存中為每個應用程序加載引用的庫函數的代碼的一個副本。
        (2)節省磁盤空間。使用動態鏈接,在磁盤上僅需要 DLL 的一個副本。使用靜態鏈接,每個應用程序都包含被引用的庫函數的代碼。
        (3)更易于升級。使用動態鏈接,DLL 中的函數發生變化時,只要函數的參數和返回值沒有更改,就不需重新編譯或重新鏈接使用它們的應用程序。使用靜態鏈接,在函數發生變化時,需要重新鏈接來生成應用程序。
        (4)支持多語言程序,只要程序遵循函數的調用約定,用不同編程語言編寫的程序就可以調用相同的DLL 函數。
        (5)提供擴展 MFC 庫類的機制??梢詮默F有 MFC 類派生類,并將它們放到 MFC 擴展 DLL 中供 MFC應用程序使用。
        (6)支持多語言程序,并使國際版本的創建輕松完成。通過將資源放到 DLL 中,創建應用程序的國際版本變得容易得多??蓪⒂糜趹贸绦虻拿總€語言版本的字符串放到單獨的 DLL 資源文件中,并使不同的語言版本加載合適的資源。[4]

      DLL 中包含下面兩類函數的定義:
      導出函數:這些函數由可執行模塊(.dll 文件或 .exe 文件)調用。
      內部函數:這些函數僅從定義它們的 DLL 中調用。DLL 還導出數據。不過,這些數據由相應的函數使用。

       可以通過下列方式調用 DLL 中的函數: 
        加載時動態鏈接:可執行模塊執行顯式調用以導出 DLL 函數。為 DLL 創建導入庫,然后將 DLL 鏈接到應用程序。在加載應用程序時,導入庫提供加載 DLL 和查找導出的 DLL 函數所需的信息。
        運行時動態鏈接:在運行時加載 DLL 時,可執行模塊使用 LoadLibrary 函數或 LoadLibraryEx 函數。可執行模塊調用 GetProcAddress 函數以獲取導出的 DLL 函數的地址。在鏈接時,Windows 搜索預安裝的一組 DLL,例如性能庫 (Kernel32.dll) 和安全庫 (User32.dll)。然后,Windows 按以下順序搜索DLL:
    1.當前進程的可執行程序所在的目錄。
    2.當前目錄。
    3.Windows 系統目錄。(GetSystemDirectory 函數獲取 Windows 系統目錄的路徑。)
    4.Windows 目錄。(GetWindowsDirectory 函數獲取 Windows 目錄的路徑。)
    5.PATH 環境變量中列出的目錄。注意:LIBPATH 環境變量不用于搜索。[3]

        DLL 有一個特殊的入口點(DllMain 函數),它在附加和分離進程和線程時運行。此行為允許根據需要創建和銷毀數據結構。文件擴展名為 .ocx、.cpl 和 .drv 的文件類型也是 DLL,盡管文件擴展名已改變。
        您可以通過創建 DLL 實現以下目的:
        (1)將程序劃分為可按需加載的單獨模塊。
        (2)存儲特定于語言或特定于區域的資源。
        (3)使您自己的應用程序能夠使用核心代碼庫。
        (4)生成進程內 COM 對象或 ActiveX 控件 (OCX)。
        (5)將 OLE 對象用作進程內 DLL。這一用法可改進 OLE 鏈接的性能。
        (6)使用控制面板擴展或使用某些類型的驅動程序。 [3]

    二、關于以.ocx為后綴名的ActiveX控件

        剛才提到過,文件擴展名為 .ocx、.cpl 和 .drv 的文件類型也是 DLL。

        現在的ActiveX 控件等價與以前的OLE控件或OCX,一個典型的控件包括設計時和運行時的用戶界面,唯一的IDispatch接口定義了控件的屬性和方法,唯一的 IConnectionPoint接口定義控件可引發的事件。一個控件可以在容器中運行,所以從運行的角度看它類似與一個DLL。[5]

        盡管 ActiveX 和 OLE 都基于組建對象模型(Component Object Model,COM),它們為程序員提供的卻是截然不同的服務。COM提供的是低級的對象捆綁機制,該機制支持對象之間的交互通訊。OLE使用COM來提供低級的應用服務,例如采用連接和嵌入機制,支持用戶創建復合文檔。與之不同,ActiveX提供更精細的結構,用以支持在網絡站點上嵌入控件,以及對事件的交互反應。優化ActiveX,目的是為了提高時間和空間效率,而優化OLE,是為了便于終端用戶的使用和集成臺式系統的應用程序。ActiveX還為Internet技術帶來了一些技術上的變革,例如,ActiveX大大減小了代碼量(代碼量減少了百分之五十到七十),支持更多的提交和異步連接。 [6]

       ActiveX的基礎是OLE和COM,但是通過MS的各種開發工具可以屏蔽掉COM模型中許多另人費解的技術細節。ActiveX組件技術包括以下一些方面:(1)自動化服務器 (2)自動化控制器 (3)控件 (4)COM對象 (5)文檔 (6)容器 。

       以.ocx為后綴名的ActiveX控件主要應用在WEB上和Window Forms程序開發上。應用程序使用ActiveX/COM組件來擴展自身的業務邏輯、事務處理和應用服務的范圍。

       順便提一下以.ocx為后綴名的ActiveX控件的注冊和卸載方法,在“開始”菜單的“運行”輸入以下代碼完成任務:
        regsvr32 path & "\xxx.ocx" '注冊
        regsvr32 /u path & "\xxx.ocx" '卸載

        其中path代表該xxx.ocx所以在的目錄的路徑。

    三、OCX和DLL的區別

       以.ocx為后綴名的ActiveX控件是一種比較特殊的DLL,它的基礎是OLE和COM,是有交互界面的可視化控件,定義了控件的屬性和方法,定義控件可引發的事件的響應。我們通常說的.DLL為后綴名的文件是一個包含函數和數據的模塊集合,可以被其它應用程序共享的程序模塊。


    本文引用:
    [1]http://zhouyi2.jblog.cn/120494.shtml
    [2]http://www.symood.com/Article/ShowArticle.asp?ArticleID=197
    [3]http://www.jr163.org/cup2/54/54294.htm
    [4]MSDN:DLL
    [5]http://www.blog.edu.cn/user2/eliming/archives/2006/1127399.shtml
    [6]http://www.symood.com/Article/ShowArticle.asp?ArticleID=198

     

    本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/scucj/archive/2006/06/29/852181.aspx

    posted on 2010-06-03 17:22 super_nini 閱讀(1264) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2010年6月>
    303112345
    6789101112
    13141516171819
    20212223242526
    27282930123
    45678910

    常用鏈接

    留言簿

    隨筆檔案

    文章檔案

    相冊

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲第一黄片大全| 亚洲级αV无码毛片久久精品| 午夜亚洲乱码伦小说区69堂| 性做久久久久免费看| 麻豆一区二区三区蜜桃免费| 国产AV无码专区亚洲AVJULIA| 国产va精品免费观看| 无套内射无矿码免费看黄| 国产亚洲高清不卡在线观看| 午夜宅男在线永久免费观看网 | 2022国内精品免费福利视频| 99久久精品国产亚洲| 国产一区视频在线免费观看| 久久综合九色综合97免费下载 | 亚洲成a人片在线不卡| 在线日韩日本国产亚洲| 美女被免费喷白浆视频| 好猛好深好爽好硬免费视频| 亚洲一级特黄特黄的大片| 亚洲精品无码精品mV在线观看| 成人毛片视频免费网站观看| 中文字幕无线码免费人妻| 亚洲中文字幕久久精品无码A| 亚洲成Av人片乱码色午夜| 国产乱子伦片免费观看中字| 中国人xxxxx69免费视频| 国产激情久久久久影院老熟女免费 | 国产极品粉嫩泬免费观看| 亚洲精品乱码久久久久蜜桃 | 好看的亚洲黄色经典| 浮力影院第一页小视频国产在线观看免费| 国产羞羞的视频在线观看免费| 亚洲av中文无码字幕色不卡| 亚洲欧洲第一a在线观看| 亚洲精品国产V片在线观看| 曰批全过程免费视频在线观看| 久久99免费视频| caoporn成人免费公开| 国产亚洲精品美女2020久久| 亚洲一区二区三区在线| 亚洲精品免费观看|