2011-08-17 81 views
2

假设您有一个使用C++ DLL的VB6应用程序。它们共享相同的内存(可以使用另一个中的指针)。该DLL在VB6应用程序中声明为Public Declare Function ... Lib ...存储在内存中的DLL的全局变量在哪里?

那么这与“堆栈从内存的一边增长,堆到另一边”哲学如何匹配呢? DLL的堆栈在哪里?应用程序启动时分配全局DLL变量吗?如果是这样,为什么当我尝试从DLL运行函数时,它只会给我一个错误?

+4

你为什么不给我们一个提示并告诉我们错误信息? – jdigital

+0

没有错误。它完美的作品。我只是想知道DLL的全局变量在内存中的位置。我认为一个进程从一个方向堆积,另一个从另一个方向堆叠 - 这使得很难说明动态加载的DLL的全局变量。 –

回答

4

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

2

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

可能在8088处理器上,“堆栈从内存的一边增长,从另一边堆积”是真实的,在现代平台上不会出现这种情况。堆栈被分配到每个线程并向上,真实的,但是在一个进程中可能有数百个堆栈。堆被分配到所有地方并且基本随机地增长。一个典型的过程也有几个堆。

4

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

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

堆栈只用于局部变量。

+0

是的,数据段是OP丢失的内存部分。当地居民生活在堆栈中,动态分配的对象存在于堆中,但静态/全局存在于它们所属的exe或dll的数据段中。 – BrendanMcK

1

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

有关内存管理的其他问题,请参阅Remus的回答。