我确定这个问题已被多次询问,我已阅读了大量文章,但我仍然不喜欢 理解它。 DLL到底在哪里加载?我在谈论DLL的实际代码。当我打电话时,让我们说,MessageBoxA,它在哪里跳转?代码是否被加载到我自己的进程中,或者它是否会跳转到其他地方(甚至不确定是否可能)?
请赐教,这一直困扰我很长一段时间,但我似乎无法弄明白。
答案 0 :(得分:2)
每个进程加载一次DLL。以下是一些更多细节:
DLL在调用进程的内存空间中执行并具有相同的访问权限
如this Stack Overflow answer中所述:
每个进程最多加载一次DLL。因此,如果您的DLL被多个其他DLL使用,则每个进程仍然会存在一次。
系统维护每个DLL的每进程引用计数。当线程加载DLL时,引用计数加1。当进程终止时,或者引用计数变为零时(仅运行时动态链接),DLL将从进程的虚拟地址空间中卸载。 与任何其他函数一样,导出的DLL函数在调用它的线程的上下文中运行。因此,以下条件适用:
- 调用DLL的进程的线程可以使用DLL函数打开的句柄。类似地,可以在DLL函数中使用由调用进程的任何线程打开的句柄。
- DLL使用调用线程的堆栈和调用进程的虚拟地址空间。
- DLL从调用进程的虚拟地址空间分配内存。
在DLL源代码文件中声明为全局的变量被编译器和链接器视为全局变量,但是加载给定DLL的每个进程都会获得该DLL的全局变量的副本。静态变量的范围仅限于声明静态变量的块。因此,默认情况下,每个进程都有自己的DLL全局变量和静态变量。
在加载DLL之前,必须找到它们。有关Windows如何搜索DLL的特定规则,例如Dynamic-Link Library Search Order中列出的那些。