[英]Where are global variables of a DLL stored in memory?
假设您有一个 VB6 应用程序,它使用 C++ DLL。 它们共享相同的 memory(您可以使用另一个指针)。 DLL 在 VB6 应用程序中声明, Public Declare Function... Lib...
那么这如何符合“堆栈从 memory 的一侧增长,从另一侧堆”的理念? DLL 的堆栈在哪里? 应用启动时是否分配了全局 DLL 变量? 如果是这样,为什么当我尝试从 DLL 运行 function 时它只会给我一个错误?
VB6 使用线程本地存储模块级变量,而不是数据段。 这意味着模块中的公共(全局)变量可以在每个不同的线程中具有不同的值。 这不是 C/C++ 开发人员所习惯的。
全局 DDL 符号将位于 DLL 映像本身中。 如果 DLL 使用符号作为指针,它附加了一些动态 memory,那么 memory 将来自 CRT 使用的任何动态分配(通常是堆)。 We would need to see exactly how the VB declaration of the C++ import looks like and what the C++ DLL does (could be initializing on DllMain, could be a static region in the DLL image, could require call to some Init functione etc etc etc) .
“堆栈从 memory 的一侧增长,堆从另一侧增长”也许在 8088 处理器上是正确的,在现代平台上不会发生这样的事情。 每个线程都会分配堆栈并向上分配,这是真的,但一个进程中可能有数百个堆栈。 堆被分配到所有地方并且基本上随机增长。 一个典型的过程也有几个堆。
每个线程通常有一个堆栈。 DLL 中的 function 将使用当前线程(被调用的线程)的堆栈。
请参阅 Remus 对有关 memory 管理的其他问题的回答。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.