存储在内存中的DLL的全局变量在哪里?

时间:2011-08-17 00:03:41

标签: c++ windows dll vb6 global-variables

假设您有一个使用C ++ DLL的VB6应用程序。它们共享相同的内存(您可以使用另一个中的指针)。 DLL在VB6应用程序中使用Public Declare Function ... Lib ...

声明

那么这又如何适应“堆栈从内存的一侧增长,从另一方面堆积”的理念呢? DLL的堆栈在哪里?是否在应用程序启动时分配了全局DLL变量?如果是这样,为什么当我尝试从DLL运行函数时它只会给我一个错误?

4 个答案:

答案 0 :(得分:4)

全局变量存储在数据段中。

http://en.wikipedia.org/wiki/Data_segment

堆栈仅用于局部变量。

答案 1 :(得分:4)

VB6将thread local storage用于模块级变量,而不是数据段。这意味着模块中的公共(全局)变量可以为每个不同的线程具有不同的值。这不是C / C ++开发人员习惯的原因。

答案 2 :(得分:2)

全局DDL符号将位于DLL图像本身中。如果DLL使用符号作为指向它附加某些动态内存的指针,那么内存将来自动态分配来自的任何内容(通常是CRT使用的堆)。我们需要确切地看到C ++导入的VB声明是什么样的以及C ++ DLL的作用(可能是在DllMain上初始化,可能是DLL映像中的静态区域,可能需要调用某些Init函数等等)

“堆栈从内存的一侧增长,堆从另一侧增长”可能在8088处理器上也是如此,现代平台上没有这样的事情发生。堆栈每个线程分配并向上,真实,但在一个进程中可能有数百个堆栈。堆在整个地方被分配并且基本上随机增长。一个典型的过程也有几个堆。

答案 3 :(得分:1)

每个线程通常有一个堆栈。 DLL中的函数将使用当前线程的堆栈(调用的线程)。

请参阅Remus对您关于内存管理的其他问题的回答。