共用方式為


關於 Dynamic-Link 程式庫

動態連結可讓模組只包含載入時間或運行時間尋找匯出 DLL 函式所需的資訊。 動態連結與更熟悉的靜態連結不同,連結器會將連結庫函式的程式代碼複製到呼叫它的每個模組中。

動態連結的類型

在 DLL 中呼叫函式的方法有兩種:

  • 載入時間動態連結中,模組會明確呼叫導出的 DLL 函式,就像是本機函式一樣。 這需要您將模組與包含函式之 DLL 的匯入連結庫連結。 匯入連結庫會提供系統載入 DLL 所需的資訊,並在載入應用程式時找出匯出的 DLL 函式。
  • 運行時間動態連結中,模組會使用 LoadLibraryLoadLibraryEx 函式,在運行時間載入 DLL。 載入 DLL 之後,模組會呼叫 GetProcAddress 函式,以取得導出 DLL 函式的位址。 模組會使用 getProcAddress 所傳回的函式指標,呼叫導出的 DLL 函式。 這樣就不需要匯入庫。

DLL 和記憶體管理

載入 DLL 的每個程式都會將其對應至其虛擬位址空間。 進程將 DLL 載入其虛擬地址之後,就可以呼叫導出的 DLL 函式。

系統會維護每個 DLL 的個別進程參考計數。 當線程載入 DLL 時,參考計數會遞增一個。 當程序終止或者參考計數變為零時(僅限於運行時動態連結),DLL 會從程序的虛擬位址空間中卸載。

如同任何其他函式,導出的 DLL 函式會在呼叫它的線程內容中執行。 因此,適用下列條件:

  • 呼叫 DLL 的進程線程可以使用 DLL 函式所開啟的句柄。 同樣地,呼叫進程的任何線程所開啟的句柄可以在 DLL 函式中使用。
  • DLL 會使用呼叫線程的堆疊和呼叫進程的虛擬位址空間。
  • DLL 會從呼叫進程的虛擬位址空間配置記憶體。

如需 DLL 的詳細資訊,請參閱下列主題: