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