我有一个程序(不是我的,没有源代码)暴露了一个接口,所以我可以写一个DLL,我的程序将调用它。现在我想知道我在这个DLL中声明了一些变量,在这个存储空间中会存储什么?
我的意思是,它只是坐在EXE地址空间的内存空间中,对吧?但是如何加载关于EXE的DLL呢?我以为DLL只在内存中加载过一次,那么这与我在DLL中创建局部变量有什么关系呢? (如对象,类等)
答案 0 :(得分:3)
每个进程一次加载DLL 。曾几何时,DLL在进程之间共享,但事实并非如此,因为Windows 3.1采用了渡渡鸟的方式。
您在DLL中声明的任何全局变量都将存储在数据页中。与EXE的全局变量不同的一页,请注意。
现在,如果在堆上分配内存,则分配是否与EXE混合取决于您使用的堆。如果EXE和DLL都使用与DLL链接的相同运行时,那么它们将从同一堆获取内存。如果它们具有不同的运行时,或静态链接运行时,它们将获得不同的堆。这成了一大堆蠕虫,所以我不会再进一步了。
答案 1 :(得分:1)
您的DLL将声明一个DllMain,它等同于常规可执行文件中的入口点。加载DLL时,会调用DLLMain。 Here是指向那里应该做的最佳实践的链接。
通常你会在那里做某种初始化。加载DLL时,会将其加载到名为LoadLibrary的可执行文件的虚拟内存空间中。 LoadLibrary处理需要处理的所有映射和重定位。从这一点开始,通过DLL分配或修改的所有内存与映射到的进程位于同一虚拟内存空间中。
大概是可执行接口通过加载你的DLL然后在其中调用某种导出函数。基本上,一旦加载DLL,你所做的一切都将在它加载到的进程的内存空间内。
如果您想更多地了解加载DLL时的确切内容,您应该查看LoadLibrary()的语义。