2010-09-22 60 views
0
  1. Windows操作系統何時將DLL加載到內存中?
  2. 該操作是在應用程序啓動時還是應用程序首先調用DLL中的某個過程時發生的?
  3. 一旦DLL被加載,它可以被卸載嗎?

回答

3

什麼時候Windows操作系統 加載到內存中的DLL?

要是連你的EXE到DLL隱含通過的.lib文件,就像你通常對於大多數Windows做的API,例如user32.dll中和KERNEL32.DLL,那麼defautl的行爲是對DLL在進程啓動時以及在調用WinMain/main函數之前加載。請參閱下面的延遲加載...

如果一個DLL依賴於另一個DLL,它將首先加載其依賴關係,如果它們尚未加載。

如果你明確地通過DLL(調用LoadLibrary,CoCreateInstance的,等...)加載代碼,然後它會被在作出這些電話

操作是否發生時 應用程序啓動或加載時 應用程序首先調用DLL中的 程序之一?

你可以擁有它。默認情況下,DLL在應用程序啓動時加載。如果您使用/DELAYLOAD linker flag,則DLL可能會推遲被加載,直到其實際需要。這是「盡最大努力」 - 如果全局變量存在奇怪的導出依賴項,則可能無法正常工作。

一旦DLL被載入,它可以被卸載嗎?

對於已鏈接的隱式DLL依賴關係,簡答題爲「否」。 FreeLibrary和CoFreeUnusedLibrary可用於LoadLibrary/CoCreateInstance調用。

0

我打算假設我們在說.net。在您需要代碼之前就會發生這種情況。但是您可以使用後期綁定在其他時間執行此操作。看到這個頁面link text

+0

我使用C++來處理winsock。任何進一步可以更詳細? – antonio081014 2010-09-22 05:28:56

0

在windows API中,你可以明確地控制一個.dll的加載和卸載。

請參閱LoadLibraryFreeLibrary作爲起點。

根據您使用的語言/工具,加載庫的許多細節將爲您照顧,但通常您仍然可以獲得明確的控制權,如果您確實需要。

+0

我正在使用C++來處理winsock。任何進一步可以更詳細? – antonio081014 2010-09-22 05:26:24