2010-09-22 61 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