2014-02-14 37 views
0

我确定这个问题已被多次询问,并且我已经阅读了大量的文章,但我仍然不知道它是如何理解的。 DLL在哪里加载?我正在谈论DLL的实际代码。当我打电话时,让我们说,MessageBoxA,它跳到哪里?代码是否被加载到我自己的进程中,还是跳到别的地方(甚至不知道这是否可能)?究竟在哪里得到加载DLL?

请赐教,这一直困扰着我很长一段时间,但我似乎无法弄清楚。

回答

2

每个进程加载一次DLL。这里有一些更多的细节:

From Wikipedia

的DLL调用进程的内存空间,并具有相同的访问权限

执行作为this Stack Overflow answer描述:

每个进程最多加载一次DLL。因此,如果您的DLL被多个其他DLL使用,它仍然会在每个进程中存在一次。

MSDN has plenty more details

该系统保持用于每个DLL每个进程的引用计数。当线程加载DLL时,引用计数会加1。当进程终止时,或者引用计数变为零(仅运行时动态链接)时,DLL将从进程的虚拟地址空间中卸载。 与任何其他函数一样,导出的DLL函数在调用它的线程上下文中运行。因此,下列条件适用:

  • 调用DLL的进程的线程可以使用由DLL函数打开的句柄。同样,由调用进程的任何线程打开的句柄都可以在DLL函数中使用。
  • DLL使用调用线程的堆栈和调用进程的虚拟地址空间。
  • DLL从调用进程的虚拟地址空间分配内存。

On Variable Scope:被声明为在DLL源代码文件全球被视为由编译器和链接器全局变量

变量,但每加载一个给定的DLL进程都有自己的该DLL的全局变量的副本。静态变量的范围仅限于声明静态变量的块。因此,默认情况下,每个进程都有自己的DLL全局和静态变量实例。

在DLL加载之前,必须找到它们。有关Windows如何搜索DLL的具体规则,例如Dynamic-Link Library Search Order上列出的那些。

相关问题