DLL的全局变量存储在内存中的什么位置?

发布于 2024-11-29 16:29:43 字数 240 浏览 0 评论 0原文

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

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

Suppose you have a VB6 app which uses a C++ DLL. They share the same memory (you can use pointers from one in the other). The DLL is declared in the VB6 app with Public Declare Function ... Lib ...

So how does this fit with the "Stack grows from one side of memory, heap from the other" philosophy? Where is the stack of the DLL? Are global DLL variables allocated when the application is started? If so, why does it only give me an error when I try to run a function from the DLL?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

满地尘埃落定 2024-12-06 16:29:43

VB6 使用线程本地存储进行模块级变量,而不是数据段。这意味着模块中的公共(全局)变量对于每个不同的线程可以具有不同的值。这不是 C/C++ 开发人员所习惯的。

VB6 uses thread local storage for module-level variables, not data segements. What this means is that public (global) variables in a module can have different values per different threads. Which is not what a C/C++ developer is used to.

铁轨上的流浪者 2024-12-06 16:29:43

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

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

堆栈仅用于局部变量。

Global variables are stored in the Data Segment.

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

The stack is only used for local variables.

梦初启 2024-12-06 16:29:43

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

“堆栈从内存的一侧增长,堆从另一侧增长”也许在 8088 处理器上是正确的,但在现代平台上不会发生这样的事情。堆栈按线程分配并向上分配,这是事实,但一个进程中可能有数百个堆栈。堆被分配到各处并且基本上是随机增长的。一个典型的进程里面也有几个堆。

Global DDL symbols will be in the DLL image itself. If the DLL uses the symbol as a pointer to which it attaches some dynamic memory, then the memory will be from whatever the dynamic allocation is from (typically the heap used by the 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).

"Stack grows from one side of memory, heap from the other" was true maybe on 8088 processors, no such thing happens on modern platforms. Stack gets allocated per thread and goes upwards, true, but there could be hundreds of stacks in a process. Heap gets allocated all over the place and grows, basically, at random. And a typical process also has several heaps in it.

遇见了你 2024-12-06 16:29:43

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

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

There is typically one stack per thread. The function in the DLL will use the stack of the current thread (the thread on which is was invoked).

See Remus's answer to your other questions about memory management.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文