DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> AJAX入門 >> AJAX詳解 >> 關於動態鏈接庫及使用動態鏈接的優點
關於動態鏈接庫及使用動態鏈接的優點
編輯:AJAX詳解     

關於動態鏈接庫

 

  動態鏈接允許一個模塊僅需載入或執行一個導出的DLL函數。動態鏈接不同於我們熟悉的靜態鏈接,使用靜態鏈接時,鏈接程序會把庫函數代碼拷貝到每個需要的模塊中。

動態鏈接的類型

  調用一個DLL中的函數有兩種方法:

  • 載入時動態鏈接(load-time dynamic linking),模塊非常明確調用某個導出函數,使得他們就像本地函數一樣。這需要鏈接時鏈接那些函數所在DLL的導入庫,導入庫向系統提供了載入DLL時所需的信息及DLL函數定位。更多信息請參照“載入時動態鏈接”。
  • 運行時動態鏈接(run-time dynamic linking),運行時可以通過LoadLibrary或LoadLibraryEx函數載入DLL。DLL載入後,模塊可以通過調用GetProcAddress獲取DLL函數的出口地址,然後就可以通過返回的函數指針調用DLL函數了。如此即可避免導入庫文件了。更多信息,請參照“使用運行時動態鏈接庫”。

 

DLL及內存管理

  每個程序載入DLL後都回把它映射到虛地址空間,然後才能調用DLL的出口函數。

  系統為每個DLL維護一個線程級的引用計數,一旦一個線程載入了該DLL,引用計數將會加1。而程序終止或者引用計數變為0(僅指運行時動態鏈接庫),DLL就會釋放占用程序的虛地址空間。

  如同其他函數一樣,一個DLL出口函數在線程的上下文中執行(或者說被調用),因此,以下情況同樣適用:

  • 調用DLL的程序線程可以使用通過DLL函數打開的句柄,相似的是,程序中任意線程打開的句柄也可以被DLL函數所使用。
  • DLL使用調用線程的棧空間及調用程序的虛地址空間。
  • DLL從調用程序的虛地址空間中分配內存。

動態鏈接的優點

 

相對於靜態鏈接來說,動態鏈接具有以下優勢:

  • 多個程序把相同的DLL載入到相同的基地址,共享其在物理內存中的唯一拷貝。這樣可以節省系統內存並減少交換。
  • 當DLL中函數變更時,只要不是函數參數變更,調用方式改變或者返回值改變的話,調用它們的應用程序就不需要進行重新編譯或重新鏈接。與之相反,靜態鏈接對象代碼就要求應用程序進行重新鏈接。
  • DLL可以提供(方便)售後服務。例如,修改顯示驅動的DLL以支持程序裝載時不支持的顯示器。
  • 不同編程語言編寫的程序只要按照函數調用約定就可以調用同一個DLL函數。調用約定(如C、Pascal或者標准調用)控制著調用時參數入棧的次序,而不用管是函數或調用函數負責清棧,或者參數是否在寄存器中。更多信息,可以參照您的編譯器的相關文檔。

  使用DLL的一個潛在缺陷是應用程序不是自完備的,它需要依賴另外的DLL模塊也要存在。如果使用載入時動態鏈接,程序啟動時發現DLL不存在,系統將終止程序並給出錯誤信息。而使用運行時動態鏈接,系統不會終止,但丟失的DLL中的出口函數同樣不可用。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved